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. 60b4e80f8857ec40c6823f1f6bfa58bf920c05bf0dEvan Cheng MachineBasicBlock *MBB; // If this is a pointer to a 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