MachineRelocation.h revision b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0
1b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner//===-- llvm/CodeGen/MachineRelocation.h - Target Relocation ----*- C++ -*-===//
2b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner//
3b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner//                     The LLVM Compiler Infrastructure
4b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner//
5b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner// This file was developed by the LLVM research group and is distributed under
6b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner// the University of Illinois Open Source License. See LICENSE.TXT for details.
7b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner//
8b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner//===----------------------------------------------------------------------===//
9b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner//
10b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner// This file defines the MachineRelocation class.
11b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner//
12b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner//===----------------------------------------------------------------------===//
13b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner
14b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner#ifndef LLVM_CODEGEN_MACHINERELOCATION_H
15b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner#define LLVM_CODEGEN_MACHINERELOCATION_H
16b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner
17b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner#include "llvm/Support/DataTypes.h"
18b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner
19b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattnernamespace llvm {
20b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattnerclass GlobalValue;
21b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner
22b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner/// MachineRelocation - This represents a target-specific relocation value,
23b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner/// produced by the code emitter.  This relocation is resolved after the has
24b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner/// been emitted, either to an object file or to memory, when the target of the
25b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner/// relocation can be resolved.
26b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner///
27b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner/// A relocation is made up of the following logical portions:
28b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner///   1. An offset in the machine code buffer, the location to modify.
29b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner///   2. A target specific relocation type (a number from 0 to 127).
30b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner///   3. A symbol being referenced, either as a GlobalValue* or as a string.
31b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner///   4. An optional constant value to be added to the reference.
32b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner///
33b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattnerclass MachineRelocation {
34b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  /// OffsetTypeExternal - The low 24-bits of this value is the offset from the
35b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  /// start of the code buffer of the relocation to perform.  Bit 24 of this is
36b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  /// set if Target should use ExtSym instead of GV, and the high 7 bits are to
37b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  /// hold the relocation type.
38b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  unsigned OffsetTypeExternal;
39b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  union {
40b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner    GlobalValue *GV;     // If this is a pointer to an LLVM global
41b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner    const char *ExtSym;  // If this is a pointer to a named symbol
42b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner    void *Result;        // If this has been resolved to a resolved pointer
43b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  } Target;
44b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  intptr_t ConstantVal;
45b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattnerpublic:
46b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  MachineRelocation(unsigned Offset, unsigned RelocationType, GlobalValue *GV,
47b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner             intptr_t cst = 0)
48b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner    : OffsetTypeExternal(Offset + (RelocationType << 25)), ConstantVal(cst) {
49b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner    assert((Offset & ~((1 << 24)-1)) == 0 && "Code offset too large!");
50b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner    assert((RelocationType & ~127) == 0 && "Relocation type too large!");
51b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner    Target.GV = GV;
52b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  }
53b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner
54b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  MachineRelocation(unsigned Offset, unsigned RelocationType, const char *ES,
55b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner             intptr_t cst = 0)
56b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner    : OffsetTypeExternal(Offset + (1 << 24) + (RelocationType << 25)),
57b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner    ConstantVal(cst) {
58b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner    assert((Offset & ~((1 << 24)-1)) == 0 && "Code offset too large!");
59b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner    assert((RelocationType & ~127) == 0 && "Relocation type too large!");
60b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner    Target.ExtSym = ES;
61b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  }
62b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner
63b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  /// getMachineCodeOffset - Return the offset into the code buffer that the
64b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  /// relocation should be performed.
65b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  unsigned getMachineCodeOffset() const {
66b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner    return OffsetTypeExternal & ((1 << 24)-1);
67b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  }
68b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner
69b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  /// getConstantVal - Get the constant value associated with this relocation.
70b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  /// This is often an offset from the symbol.
71b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  ///
72b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  intptr_t getConstantVal() const {
73b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner    return ConstantVal;
74b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  }
75b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner
76b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  /// isGlobalValue - Return true if this relocation is a GlobalValue, as
77b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  /// opposed to a constant string.
78b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  bool isGlobalValue() const {
79b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner    return (OffsetTypeExternal & (1 << 24)) == 0;
80b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  }
81b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner
82b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  /// isString - Return true if this is a constant string.
83b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  ///
84b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  bool isString() const {
85b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner    return !isGlobalValue();
86b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  }
87b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner
88b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  /// getGlobalValue - If this is a global value reference, return the
89b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  /// referenced global.
90b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  GlobalValue *getGlobalValue() const {
91b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner    assert(isGlobalValue() && "This is not a global value reference!");
92b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner    return Target.GV;
93b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  }
94b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner
95b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  /// getString - If this is a string value, return the string reference.
96b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  ///
97b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  const char *getString() const {
98b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner    assert(isString() && "This is not a string reference!");
99b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner    return Target.ExtSym;
100b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  }
101b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner
102b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  /// getResultPointer - Once this has been resolved to point to an actual
103b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  /// address, this returns the pointer.
104b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  void *getResultPointer() const {
105b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner    return Target.Result;
106b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  }
107b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner
108b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  /// setResultPointer - Set the result to the specified pointer value.
109b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  ///
110b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  void setResultPointer(void *Ptr) {
111b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner    Target.Result = Ptr;
112b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  }
113b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner};
114b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner
115b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner}
116b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner
117b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner#endif
118