1b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner//===-- llvm/CodeGen/MachineRelocation.h - Target Relocation ----*- C++ -*-===//
2ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
3b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner//                     The LLVM Compiler Infrastructure
4b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner//
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details.
7ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
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
171f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/DataTypes.h"
184e2239dc5c0b2cf6b9e3b76e76ae70ca09d68fd9Chris Lattner#include <cassert>
19b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner
20b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattnernamespace llvm {
21b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattnerclass GlobalValue;
22b4e80f8857ec40c6823f1f6bfa58bf920c05bf0dEvan Chengclass MachineBasicBlock;
23b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner
24b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner/// MachineRelocation - This represents a target-specific relocation value,
25b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner/// produced by the code emitter.  This relocation is resolved after the has
26b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner/// been emitted, either to an object file or to memory, when the target of the
27b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner/// relocation can be resolved.
28b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner///
29b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner/// A relocation is made up of the following logical portions:
30b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner///   1. An offset in the machine code buffer, the location to modify.
31765da91525b3b606dba71350c797bf123c3dff74Chris Lattner///   2. A target specific relocation type (a number from 0 to 63).
32b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner///   3. A symbol being referenced, either as a GlobalValue* or as a string.
33b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner///   4. An optional constant value to be added to the reference.
34765da91525b3b606dba71350c797bf123c3dff74Chris Lattner///   5. A bit, CanRewrite, which indicates to the JIT that a function stub is
35765da91525b3b606dba71350c797bf123c3dff74Chris Lattner///      not needed for the relocation.
366a6b2dbd3a6786c6ef3d79a0b685291631245d32Andrew Lenharth///   6. An index into the GOT, if the target uses a GOT
37b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner///
38b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattnerclass MachineRelocation {
391e3822c7761933b588048b8128b12d495d312703Chris Lattner  enum AddressType {
401e3822c7761933b588048b8128b12d495d312703Chris Lattner    isResult,         // Relocation has be transformed into its result pointer.
411e3822c7761933b588048b8128b12d495d312703Chris Lattner    isGV,             // The Target.GV field is valid.
429ed2f80910160bbf8051d91cd74c82d4619885b4Evan Cheng    isIndirectSym,    // Relocation of an indirect symbol.
43b4e80f8857ec40c6823f1f6bfa58bf920c05bf0dEvan Cheng    isBB,             // Relocation of BB address.
441e3822c7761933b588048b8128b12d495d312703Chris Lattner    isExtSym,         // The Target.ExtSym field is valid.
4552b510b4c4f36f58c4aa37a1f835eb95e89e0adbEvan Cheng    isConstPool,      // Relocation of constant pool address.
4652b510b4c4f36f58c4aa37a1f835eb95e89e0adbEvan Cheng    isJumpTable,      // Relocation of jump table address.
471e3822c7761933b588048b8128b12d495d312703Chris Lattner    isGOTIndex        // The Target.GOTIndex field is valid.
481e3822c7761933b588048b8128b12d495d312703Chris Lattner  };
491e3822c7761933b588048b8128b12d495d312703Chris Lattner
501e3822c7761933b588048b8128b12d495d312703Chris Lattner  /// Offset - This is the offset from the start of the code buffer of the
511e3822c7761933b588048b8128b12d495d312703Chris Lattner  /// relocation to perform.
525788d1a169db3346a612a13113348d2709bdd15bEvan Cheng  uintptr_t Offset;
531e3822c7761933b588048b8128b12d495d312703Chris Lattner
541e3822c7761933b588048b8128b12d495d312703Chris Lattner  /// ConstantVal - A field that may be used by the target relocation type.
551e3822c7761933b588048b8128b12d495d312703Chris Lattner  intptr_t ConstantVal;
561e3822c7761933b588048b8128b12d495d312703Chris Lattner
57b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  union {
58b4e80f8857ec40c6823f1f6bfa58bf920c05bf0dEvan Cheng    void *Result;           // If this has been resolved to a resolved pointer
599ed2f80910160bbf8051d91cd74c82d4619885b4Evan Cheng    GlobalValue *GV;        // If this is a pointer to a GV or an indirect ref.
6013230064236e0cb916cefddcd75bd55d9ce15c41Daniel Dunbar    MachineBasicBlock *MBB; // If this is a pointer to an LLVM BB
61b4e80f8857ec40c6823f1f6bfa58bf920c05bf0dEvan Cheng    const char *ExtSym;     // If this is a pointer to a named symbol
62b4e80f8857ec40c6823f1f6bfa58bf920c05bf0dEvan Cheng    unsigned Index;         // Constant pool / jump table index
63b4e80f8857ec40c6823f1f6bfa58bf920c05bf0dEvan Cheng    unsigned GOTIndex;      // Index in the GOT of this symbol/global
64b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  } Target;
651e3822c7761933b588048b8128b12d495d312703Chris Lattner
6670ba70f0659c331f02675139d3ae42d021e3d5b3Evan Cheng  unsigned TargetReloType : 6; // The target relocation ID
6770ba70f0659c331f02675139d3ae42d021e3d5b3Evan Cheng  AddressType AddrType    : 4; // The field of Target to use
682d274412ed9aab277e070690c574714ec544cf94Jeffrey Yasskin  bool MayNeedFarStub     : 1; // True if this relocation may require a far-stub
691e3822c7761933b588048b8128b12d495d312703Chris Lattner  bool GOTRelative        : 1; // Should this relocation be relative to the GOT?
7070ba70f0659c331f02675139d3ae42d021e3d5b3Evan Cheng  bool TargetResolve      : 1; // True if target should resolve the address
716a6b2dbd3a6786c6ef3d79a0b685291631245d32Andrew Lenharth
72b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattnerpublic:
735381baa051562f0ec14ffa97072c0a9adfe87bf0Nate Begeman // Relocation types used in a generic implementation.  Currently, relocation
745381baa051562f0ec14ffa97072c0a9adfe87bf0Nate Begeman // entries for all things use the generic VANILLA type until they are refined
755381baa051562f0ec14ffa97072c0a9adfe87bf0Nate Begeman // into target relocation types.
765381baa051562f0ec14ffa97072c0a9adfe87bf0Nate Begeman  enum RelocationType {
775381baa051562f0ec14ffa97072c0a9adfe87bf0Nate Begeman    VANILLA
785381baa051562f0ec14ffa97072c0a9adfe87bf0Nate Begeman  };
795381baa051562f0ec14ffa97072c0a9adfe87bf0Nate Begeman
805a032de387831b9de3a707292eade95934938da9Chris Lattner  /// MachineRelocation::getGV - Return a relocation entry for a GlobalValue.
815a032de387831b9de3a707292eade95934938da9Chris Lattner  ///
825788d1a169db3346a612a13113348d2709bdd15bEvan Cheng  static MachineRelocation getGV(uintptr_t offset, unsigned RelocationType,
835a032de387831b9de3a707292eade95934938da9Chris Lattner                                 GlobalValue *GV, intptr_t cst = 0,
842d274412ed9aab277e070690c574714ec544cf94Jeffrey Yasskin                                 bool MayNeedFarStub = 0,
855a032de387831b9de3a707292eade95934938da9Chris Lattner                                 bool GOTrelative = 0) {
86765da91525b3b606dba71350c797bf123c3dff74Chris Lattner    assert((RelocationType & ~63) == 0 && "Relocation type too large!");
875a032de387831b9de3a707292eade95934938da9Chris Lattner    MachineRelocation Result;
885a032de387831b9de3a707292eade95934938da9Chris Lattner    Result.Offset = offset;
895a032de387831b9de3a707292eade95934938da9Chris Lattner    Result.ConstantVal = cst;
905a032de387831b9de3a707292eade95934938da9Chris Lattner    Result.TargetReloType = RelocationType;
915a032de387831b9de3a707292eade95934938da9Chris Lattner    Result.AddrType = isGV;
922d274412ed9aab277e070690c574714ec544cf94Jeffrey Yasskin    Result.MayNeedFarStub = MayNeedFarStub;
935a032de387831b9de3a707292eade95934938da9Chris Lattner    Result.GOTRelative = GOTrelative;
9470ba70f0659c331f02675139d3ae42d021e3d5b3Evan Cheng    Result.TargetResolve = false;
955a032de387831b9de3a707292eade95934938da9Chris Lattner    Result.Target.GV = GV;
965a032de387831b9de3a707292eade95934938da9Chris Lattner    return Result;
97b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  }
98b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner
999ed2f80910160bbf8051d91cd74c82d4619885b4Evan Cheng  /// MachineRelocation::getIndirectSymbol - Return a relocation entry for an
1009ed2f80910160bbf8051d91cd74c82d4619885b4Evan Cheng  /// indirect symbol.
1015788d1a169db3346a612a13113348d2709bdd15bEvan Cheng  static MachineRelocation getIndirectSymbol(uintptr_t offset,
1029ed2f80910160bbf8051d91cd74c82d4619885b4Evan Cheng                                             unsigned RelocationType,
1039ed2f80910160bbf8051d91cd74c82d4619885b4Evan Cheng                                             GlobalValue *GV, intptr_t cst = 0,
1042d274412ed9aab277e070690c574714ec544cf94Jeffrey Yasskin                                             bool MayNeedFarStub = 0,
1059ed2f80910160bbf8051d91cd74c82d4619885b4Evan Cheng                                             bool GOTrelative = 0) {
106be8c03fc66b75fa775e1f47d62a1b0d803fced1cEvan Cheng    assert((RelocationType & ~63) == 0 && "Relocation type too large!");
107be8c03fc66b75fa775e1f47d62a1b0d803fced1cEvan Cheng    MachineRelocation Result;
108be8c03fc66b75fa775e1f47d62a1b0d803fced1cEvan Cheng    Result.Offset = offset;
109be8c03fc66b75fa775e1f47d62a1b0d803fced1cEvan Cheng    Result.ConstantVal = cst;
110be8c03fc66b75fa775e1f47d62a1b0d803fced1cEvan Cheng    Result.TargetReloType = RelocationType;
1119ed2f80910160bbf8051d91cd74c82d4619885b4Evan Cheng    Result.AddrType = isIndirectSym;
1122d274412ed9aab277e070690c574714ec544cf94Jeffrey Yasskin    Result.MayNeedFarStub = MayNeedFarStub;
113be8c03fc66b75fa775e1f47d62a1b0d803fced1cEvan Cheng    Result.GOTRelative = GOTrelative;
11470ba70f0659c331f02675139d3ae42d021e3d5b3Evan Cheng    Result.TargetResolve = false;
115be8c03fc66b75fa775e1f47d62a1b0d803fced1cEvan Cheng    Result.Target.GV = GV;
116be8c03fc66b75fa775e1f47d62a1b0d803fced1cEvan Cheng    return Result;
117be8c03fc66b75fa775e1f47d62a1b0d803fced1cEvan Cheng  }
118be8c03fc66b75fa775e1f47d62a1b0d803fced1cEvan Cheng
119b4e80f8857ec40c6823f1f6bfa58bf920c05bf0dEvan Cheng  /// MachineRelocation::getBB - Return a relocation entry for a BB.
120b4e80f8857ec40c6823f1f6bfa58bf920c05bf0dEvan Cheng  ///
1215788d1a169db3346a612a13113348d2709bdd15bEvan Cheng  static MachineRelocation getBB(uintptr_t offset,unsigned RelocationType,
122b4e80f8857ec40c6823f1f6bfa58bf920c05bf0dEvan Cheng                                 MachineBasicBlock *MBB, intptr_t cst = 0) {
123b4e80f8857ec40c6823f1f6bfa58bf920c05bf0dEvan Cheng    assert((RelocationType & ~63) == 0 && "Relocation type too large!");
124b4e80f8857ec40c6823f1f6bfa58bf920c05bf0dEvan Cheng    MachineRelocation Result;
125b4e80f8857ec40c6823f1f6bfa58bf920c05bf0dEvan Cheng    Result.Offset = offset;
126b4e80f8857ec40c6823f1f6bfa58bf920c05bf0dEvan Cheng    Result.ConstantVal = cst;
127b4e80f8857ec40c6823f1f6bfa58bf920c05bf0dEvan Cheng    Result.TargetReloType = RelocationType;
128b4e80f8857ec40c6823f1f6bfa58bf920c05bf0dEvan Cheng    Result.AddrType = isBB;
1292d274412ed9aab277e070690c574714ec544cf94Jeffrey Yasskin    Result.MayNeedFarStub = false;
130b4e80f8857ec40c6823f1f6bfa58bf920c05bf0dEvan Cheng    Result.GOTRelative = false;
13170ba70f0659c331f02675139d3ae42d021e3d5b3Evan Cheng    Result.TargetResolve = false;
132b4e80f8857ec40c6823f1f6bfa58bf920c05bf0dEvan Cheng    Result.Target.MBB = MBB;
133b4e80f8857ec40c6823f1f6bfa58bf920c05bf0dEvan Cheng    return Result;
134b4e80f8857ec40c6823f1f6bfa58bf920c05bf0dEvan Cheng  }
135b4e80f8857ec40c6823f1f6bfa58bf920c05bf0dEvan Cheng
1365a032de387831b9de3a707292eade95934938da9Chris Lattner  /// MachineRelocation::getExtSym - Return a relocation entry for an external
1375a032de387831b9de3a707292eade95934938da9Chris Lattner  /// symbol, like "free".
1385a032de387831b9de3a707292eade95934938da9Chris Lattner  ///
1395788d1a169db3346a612a13113348d2709bdd15bEvan Cheng  static MachineRelocation getExtSym(uintptr_t offset, unsigned RelocationType,
140652f7ea955bb433d6b7a4d33685dca9485fd7b8bEvan Cheng                                     const char *ES, intptr_t cst = 0,
14185bb54f96421461aaafcde83b6302530179337e9Evan Phoenix                                     bool GOTrelative = 0,
14285bb54f96421461aaafcde83b6302530179337e9Evan Phoenix                                     bool NeedStub = true) {
143765da91525b3b606dba71350c797bf123c3dff74Chris Lattner    assert((RelocationType & ~63) == 0 && "Relocation type too large!");
1445a032de387831b9de3a707292eade95934938da9Chris Lattner    MachineRelocation Result;
1455a032de387831b9de3a707292eade95934938da9Chris Lattner    Result.Offset = offset;
1465a032de387831b9de3a707292eade95934938da9Chris Lattner    Result.ConstantVal = cst;
1475a032de387831b9de3a707292eade95934938da9Chris Lattner    Result.TargetReloType = RelocationType;
1485a032de387831b9de3a707292eade95934938da9Chris Lattner    Result.AddrType = isExtSym;
14985bb54f96421461aaafcde83b6302530179337e9Evan Phoenix    Result.MayNeedFarStub = NeedStub;
1505a032de387831b9de3a707292eade95934938da9Chris Lattner    Result.GOTRelative = GOTrelative;
15170ba70f0659c331f02675139d3ae42d021e3d5b3Evan Cheng    Result.TargetResolve = false;
152652f7ea955bb433d6b7a4d33685dca9485fd7b8bEvan Cheng    Result.Target.ExtSym = ES;
1535a032de387831b9de3a707292eade95934938da9Chris Lattner    return Result;
154b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  }
155b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner
1565a032de387831b9de3a707292eade95934938da9Chris Lattner  /// MachineRelocation::getConstPool - Return a relocation entry for a constant
1575a032de387831b9de3a707292eade95934938da9Chris Lattner  /// pool entry.
1585a032de387831b9de3a707292eade95934938da9Chris Lattner  ///
1595788d1a169db3346a612a13113348d2709bdd15bEvan Cheng  static MachineRelocation getConstPool(uintptr_t offset,unsigned RelocationType,
16070ba70f0659c331f02675139d3ae42d021e3d5b3Evan Cheng                                        unsigned CPI, intptr_t cst = 0,
16170ba70f0659c331f02675139d3ae42d021e3d5b3Evan Cheng                                        bool letTargetResolve = false) {
1626a6b2dbd3a6786c6ef3d79a0b685291631245d32Andrew Lenharth    assert((RelocationType & ~63) == 0 && "Relocation type too large!");
1635a032de387831b9de3a707292eade95934938da9Chris Lattner    MachineRelocation Result;
1645a032de387831b9de3a707292eade95934938da9Chris Lattner    Result.Offset = offset;
1655a032de387831b9de3a707292eade95934938da9Chris Lattner    Result.ConstantVal = cst;
1665a032de387831b9de3a707292eade95934938da9Chris Lattner    Result.TargetReloType = RelocationType;
1675a032de387831b9de3a707292eade95934938da9Chris Lattner    Result.AddrType = isConstPool;
1682d274412ed9aab277e070690c574714ec544cf94Jeffrey Yasskin    Result.MayNeedFarStub = false;
1695a032de387831b9de3a707292eade95934938da9Chris Lattner    Result.GOTRelative = false;
17070ba70f0659c331f02675139d3ae42d021e3d5b3Evan Cheng    Result.TargetResolve = letTargetResolve;
17152b510b4c4f36f58c4aa37a1f835eb95e89e0adbEvan Cheng    Result.Target.Index = CPI;
17252b510b4c4f36f58c4aa37a1f835eb95e89e0adbEvan Cheng    return Result;
17352b510b4c4f36f58c4aa37a1f835eb95e89e0adbEvan Cheng  }
17452b510b4c4f36f58c4aa37a1f835eb95e89e0adbEvan Cheng
17552b510b4c4f36f58c4aa37a1f835eb95e89e0adbEvan Cheng  /// MachineRelocation::getJumpTable - Return a relocation entry for a jump
17652b510b4c4f36f58c4aa37a1f835eb95e89e0adbEvan Cheng  /// table entry.
17752b510b4c4f36f58c4aa37a1f835eb95e89e0adbEvan Cheng  ///
1785788d1a169db3346a612a13113348d2709bdd15bEvan Cheng  static MachineRelocation getJumpTable(uintptr_t offset,unsigned RelocationType,
179a27b3532e2abd8a5f9972db9d64441d6544798cbEvan Cheng                                        unsigned JTI, intptr_t cst = 0,
180a27b3532e2abd8a5f9972db9d64441d6544798cbEvan Cheng                                        bool letTargetResolve = false) {
18152b510b4c4f36f58c4aa37a1f835eb95e89e0adbEvan Cheng    assert((RelocationType & ~63) == 0 && "Relocation type too large!");
18252b510b4c4f36f58c4aa37a1f835eb95e89e0adbEvan Cheng    MachineRelocation Result;
18352b510b4c4f36f58c4aa37a1f835eb95e89e0adbEvan Cheng    Result.Offset = offset;
18452b510b4c4f36f58c4aa37a1f835eb95e89e0adbEvan Cheng    Result.ConstantVal = cst;
18552b510b4c4f36f58c4aa37a1f835eb95e89e0adbEvan Cheng    Result.TargetReloType = RelocationType;
18652b510b4c4f36f58c4aa37a1f835eb95e89e0adbEvan Cheng    Result.AddrType = isJumpTable;
1872d274412ed9aab277e070690c574714ec544cf94Jeffrey Yasskin    Result.MayNeedFarStub = false;
18852b510b4c4f36f58c4aa37a1f835eb95e89e0adbEvan Cheng    Result.GOTRelative = false;
189a27b3532e2abd8a5f9972db9d64441d6544798cbEvan Cheng    Result.TargetResolve = letTargetResolve;
19052b510b4c4f36f58c4aa37a1f835eb95e89e0adbEvan Cheng    Result.Target.Index = JTI;
1915a032de387831b9de3a707292eade95934938da9Chris Lattner    return Result;
1926a6b2dbd3a6786c6ef3d79a0b685291631245d32Andrew Lenharth  }
1936a6b2dbd3a6786c6ef3d79a0b685291631245d32Andrew Lenharth
194b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  /// getMachineCodeOffset - Return the offset into the code buffer that the
195b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  /// relocation should be performed.
1965a032de387831b9de3a707292eade95934938da9Chris Lattner  intptr_t getMachineCodeOffset() const {
1971e3822c7761933b588048b8128b12d495d312703Chris Lattner    return Offset;
198b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  }
199b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner
200fab11a711021768cd3cf30f699bf4adf26fdaccfChris Lattner  /// getRelocationType - Return the target-specific relocation ID for this
201fab11a711021768cd3cf30f699bf4adf26fdaccfChris Lattner  /// relocation.
202fab11a711021768cd3cf30f699bf4adf26fdaccfChris Lattner  unsigned getRelocationType() const {
2031e3822c7761933b588048b8128b12d495d312703Chris Lattner    return TargetReloType;
204fab11a711021768cd3cf30f699bf4adf26fdaccfChris Lattner  }
205fab11a711021768cd3cf30f699bf4adf26fdaccfChris Lattner
206b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  /// getConstantVal - Get the constant value associated with this relocation.
207b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  /// This is often an offset from the symbol.
208b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  ///
209b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  intptr_t getConstantVal() const {
210b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner    return ConstantVal;
211b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  }
212b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner
2135381baa051562f0ec14ffa97072c0a9adfe87bf0Nate Begeman  /// setConstantVal - Set the constant value associated with this relocation.
2145381baa051562f0ec14ffa97072c0a9adfe87bf0Nate Begeman  /// This is often an offset from the symbol.
2155381baa051562f0ec14ffa97072c0a9adfe87bf0Nate Begeman  ///
2165381baa051562f0ec14ffa97072c0a9adfe87bf0Nate Begeman  void setConstantVal(intptr_t val) {
2175381baa051562f0ec14ffa97072c0a9adfe87bf0Nate Begeman    ConstantVal = val;
2185381baa051562f0ec14ffa97072c0a9adfe87bf0Nate Begeman  }
2195381baa051562f0ec14ffa97072c0a9adfe87bf0Nate Begeman
220b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  /// isGlobalValue - Return true if this relocation is a GlobalValue, as
221b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  /// opposed to a constant string.
222b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  bool isGlobalValue() const {
2231e3822c7761933b588048b8128b12d495d312703Chris Lattner    return AddrType == isGV;
224b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  }
225b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner
2269ed2f80910160bbf8051d91cd74c82d4619885b4Evan Cheng  /// isIndirectSymbol - Return true if this relocation is the address an
2279ed2f80910160bbf8051d91cd74c82d4619885b4Evan Cheng  /// indirect symbol
2289ed2f80910160bbf8051d91cd74c82d4619885b4Evan Cheng  bool isIndirectSymbol() const {
2299ed2f80910160bbf8051d91cd74c82d4619885b4Evan Cheng    return AddrType == isIndirectSym;
230be8c03fc66b75fa775e1f47d62a1b0d803fced1cEvan Cheng  }
231be8c03fc66b75fa775e1f47d62a1b0d803fced1cEvan Cheng
232b4e80f8857ec40c6823f1f6bfa58bf920c05bf0dEvan Cheng  /// isBasicBlock - Return true if this relocation is a basic block reference.
233b4e80f8857ec40c6823f1f6bfa58bf920c05bf0dEvan Cheng  ///
234b4e80f8857ec40c6823f1f6bfa58bf920c05bf0dEvan Cheng  bool isBasicBlock() const {
235b4e80f8857ec40c6823f1f6bfa58bf920c05bf0dEvan Cheng    return AddrType == isBB;
236b4e80f8857ec40c6823f1f6bfa58bf920c05bf0dEvan Cheng  }
237b4e80f8857ec40c6823f1f6bfa58bf920c05bf0dEvan Cheng
238d7398c9b699cae3a109e9808401f7d0b2fc7e686Evan Cheng  /// isExternalSymbol - Return true if this is a constant string.
239b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  ///
240d7398c9b699cae3a109e9808401f7d0b2fc7e686Evan Cheng  bool isExternalSymbol() const {
2411e3822c7761933b588048b8128b12d495d312703Chris Lattner    return AddrType == isExtSym;
2426a6b2dbd3a6786c6ef3d79a0b685291631245d32Andrew Lenharth  }
2436a6b2dbd3a6786c6ef3d79a0b685291631245d32Andrew Lenharth
2446a6b2dbd3a6786c6ef3d79a0b685291631245d32Andrew Lenharth  /// isConstantPoolIndex - Return true if this is a constant pool reference.
2456a6b2dbd3a6786c6ef3d79a0b685291631245d32Andrew Lenharth  ///
2466a6b2dbd3a6786c6ef3d79a0b685291631245d32Andrew Lenharth  bool isConstantPoolIndex() const {
2471e3822c7761933b588048b8128b12d495d312703Chris Lattner    return AddrType == isConstPool;
2486a6b2dbd3a6786c6ef3d79a0b685291631245d32Andrew Lenharth  }
2496a6b2dbd3a6786c6ef3d79a0b685291631245d32Andrew Lenharth
25052b510b4c4f36f58c4aa37a1f835eb95e89e0adbEvan Cheng  /// isJumpTableIndex - Return true if this is a jump table reference.
25152b510b4c4f36f58c4aa37a1f835eb95e89e0adbEvan Cheng  ///
25252b510b4c4f36f58c4aa37a1f835eb95e89e0adbEvan Cheng  bool isJumpTableIndex() const {
25352b510b4c4f36f58c4aa37a1f835eb95e89e0adbEvan Cheng    return AddrType == isJumpTable;
25452b510b4c4f36f58c4aa37a1f835eb95e89e0adbEvan Cheng  }
25552b510b4c4f36f58c4aa37a1f835eb95e89e0adbEvan Cheng
2566a6b2dbd3a6786c6ef3d79a0b685291631245d32Andrew Lenharth  /// isGOTRelative - Return true the target wants the index into the GOT of
2576a6b2dbd3a6786c6ef3d79a0b685291631245d32Andrew Lenharth  /// the symbol rather than the address of the symbol.
2586a6b2dbd3a6786c6ef3d79a0b685291631245d32Andrew Lenharth  bool isGOTRelative() const {
2596a6b2dbd3a6786c6ef3d79a0b685291631245d32Andrew Lenharth    return GOTRelative;
260b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  }
261b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner
2622d274412ed9aab277e070690c574714ec544cf94Jeffrey Yasskin  /// mayNeedFarStub - This function returns true if the JIT for this target may
2632d274412ed9aab277e070690c574714ec544cf94Jeffrey Yasskin  /// need either a stub function or an indirect global-variable load to handle
2642d274412ed9aab277e070690c574714ec544cf94Jeffrey Yasskin  /// the relocated GlobalValue reference.  For example, the x86-64 call
2652d274412ed9aab277e070690c574714ec544cf94Jeffrey Yasskin  /// instruction can only call functions within +/-2GB of the call site.
2662d274412ed9aab277e070690c574714ec544cf94Jeffrey Yasskin  /// Anything farther away needs a longer mov+call sequence, which can't just
2672d274412ed9aab277e070690c574714ec544cf94Jeffrey Yasskin  /// be written on top of the existing call.
2682d274412ed9aab277e070690c574714ec544cf94Jeffrey Yasskin  bool mayNeedFarStub() const {
2692d274412ed9aab277e070690c574714ec544cf94Jeffrey Yasskin    return MayNeedFarStub;
270765da91525b3b606dba71350c797bf123c3dff74Chris Lattner  }
271765da91525b3b606dba71350c797bf123c3dff74Chris Lattner
27270ba70f0659c331f02675139d3ae42d021e3d5b3Evan Cheng  /// letTargetResolve - Return true if the target JITInfo is usually
27370ba70f0659c331f02675139d3ae42d021e3d5b3Evan Cheng  /// responsible for resolving the address of this relocation.
27470ba70f0659c331f02675139d3ae42d021e3d5b3Evan Cheng  bool letTargetResolve() const {
27570ba70f0659c331f02675139d3ae42d021e3d5b3Evan Cheng    return TargetResolve;
27670ba70f0659c331f02675139d3ae42d021e3d5b3Evan Cheng  }
27770ba70f0659c331f02675139d3ae42d021e3d5b3Evan Cheng
278b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  /// getGlobalValue - If this is a global value reference, return the
279b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  /// referenced global.
280b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  GlobalValue *getGlobalValue() const {
2819ed2f80910160bbf8051d91cd74c82d4619885b4Evan Cheng    assert((isGlobalValue() || isIndirectSymbol()) &&
282be8c03fc66b75fa775e1f47d62a1b0d803fced1cEvan Cheng           "This is not a global value reference!");
283b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner    return Target.GV;
284b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  }
285b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner
286b4e80f8857ec40c6823f1f6bfa58bf920c05bf0dEvan Cheng  MachineBasicBlock *getBasicBlock() const {
287b4e80f8857ec40c6823f1f6bfa58bf920c05bf0dEvan Cheng    assert(isBasicBlock() && "This is not a basic block reference!");
288b4e80f8857ec40c6823f1f6bfa58bf920c05bf0dEvan Cheng    return Target.MBB;
289b4e80f8857ec40c6823f1f6bfa58bf920c05bf0dEvan Cheng  }
290b4e80f8857ec40c6823f1f6bfa58bf920c05bf0dEvan Cheng
291b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  /// getString - If this is a string value, return the string reference.
292b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  ///
293d7398c9b699cae3a109e9808401f7d0b2fc7e686Evan Cheng  const char *getExternalSymbol() const {
294d7398c9b699cae3a109e9808401f7d0b2fc7e686Evan Cheng    assert(isExternalSymbol() && "This is not an external symbol reference!");
295b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner    return Target.ExtSym;
296b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  }
297b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner
2986a6b2dbd3a6786c6ef3d79a0b685291631245d32Andrew Lenharth  /// getConstantPoolIndex - If this is a const pool reference, return
2996a6b2dbd3a6786c6ef3d79a0b685291631245d32Andrew Lenharth  /// the index into the constant pool.
3006a6b2dbd3a6786c6ef3d79a0b685291631245d32Andrew Lenharth  unsigned getConstantPoolIndex() const {
3016a6b2dbd3a6786c6ef3d79a0b685291631245d32Andrew Lenharth    assert(isConstantPoolIndex() && "This is not a constant pool reference!");
30252b510b4c4f36f58c4aa37a1f835eb95e89e0adbEvan Cheng    return Target.Index;
30352b510b4c4f36f58c4aa37a1f835eb95e89e0adbEvan Cheng  }
30452b510b4c4f36f58c4aa37a1f835eb95e89e0adbEvan Cheng
30552b510b4c4f36f58c4aa37a1f835eb95e89e0adbEvan Cheng  /// getJumpTableIndex - If this is a jump table reference, return
30652b510b4c4f36f58c4aa37a1f835eb95e89e0adbEvan Cheng  /// the index into the jump table.
30752b510b4c4f36f58c4aa37a1f835eb95e89e0adbEvan Cheng  unsigned getJumpTableIndex() const {
30852b510b4c4f36f58c4aa37a1f835eb95e89e0adbEvan Cheng    assert(isJumpTableIndex() && "This is not a jump table reference!");
30952b510b4c4f36f58c4aa37a1f835eb95e89e0adbEvan Cheng    return Target.Index;
3106a6b2dbd3a6786c6ef3d79a0b685291631245d32Andrew Lenharth  }
3116a6b2dbd3a6786c6ef3d79a0b685291631245d32Andrew Lenharth
312b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  /// getResultPointer - Once this has been resolved to point to an actual
313b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  /// address, this returns the pointer.
314b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  void *getResultPointer() const {
3151e3822c7761933b588048b8128b12d495d312703Chris Lattner    assert(AddrType == isResult && "Result pointer isn't set yet!");
316b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner    return Target.Result;
317b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  }
318b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner
319b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  /// setResultPointer - Set the result to the specified pointer value.
320b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  ///
321b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  void setResultPointer(void *Ptr) {
322b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner    Target.Result = Ptr;
3231e3822c7761933b588048b8128b12d495d312703Chris Lattner    AddrType = isResult;
324b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner  }
3256a6b2dbd3a6786c6ef3d79a0b685291631245d32Andrew Lenharth
3266a6b2dbd3a6786c6ef3d79a0b685291631245d32Andrew Lenharth  /// setGOTIndex - Set the GOT index to a specific value.
3276a6b2dbd3a6786c6ef3d79a0b685291631245d32Andrew Lenharth  void setGOTIndex(unsigned idx) {
3281e3822c7761933b588048b8128b12d495d312703Chris Lattner    AddrType = isGOTIndex;
3296a6b2dbd3a6786c6ef3d79a0b685291631245d32Andrew Lenharth    Target.GOTIndex = idx;
3306a6b2dbd3a6786c6ef3d79a0b685291631245d32Andrew Lenharth  }
3316a6b2dbd3a6786c6ef3d79a0b685291631245d32Andrew Lenharth
3326a6b2dbd3a6786c6ef3d79a0b685291631245d32Andrew Lenharth  /// getGOTIndex - Once this has been resolved to an entry in the GOT,
3339eb59ec548b861d6ede05b4e6dc22aabf645e665Jeff Cohen  /// this returns that index.  The index is from the lowest address entry
3346a6b2dbd3a6786c6ef3d79a0b685291631245d32Andrew Lenharth  /// in the GOT.
3356a6b2dbd3a6786c6ef3d79a0b685291631245d32Andrew Lenharth  unsigned getGOTIndex() const {
3361e3822c7761933b588048b8128b12d495d312703Chris Lattner    assert(AddrType == isGOTIndex);
3376a6b2dbd3a6786c6ef3d79a0b685291631245d32Andrew Lenharth    return Target.GOTIndex;
3386a6b2dbd3a6786c6ef3d79a0b685291631245d32Andrew Lenharth  }
339b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner};
340b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner}
341b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner
342b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner#endif
343