X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FCodeGen%2FMachineRelocation.h;h=244b466e172826a465e2ed6143cd04cba3aa7b97;hb=425e951734c3a0615e22ec94ffa51cc16ce6e483;hp=6ea8f076684ba0afc855da68d95a3d208888381a;hpb=8b67f774e9c38b7718b2b300b628388f966df4e0;p=oota-llvm.git diff --git a/include/llvm/CodeGen/MachineRelocation.h b/include/llvm/CodeGen/MachineRelocation.h index 6ea8f076684..244b466e172 100644 --- a/include/llvm/CodeGen/MachineRelocation.h +++ b/include/llvm/CodeGen/MachineRelocation.h @@ -14,7 +14,7 @@ #ifndef LLVM_CODEGEN_MACHINERELOCATION_H #define LLVM_CODEGEN_MACHINERELOCATION_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include namespace llvm { @@ -65,7 +65,7 @@ class MachineRelocation { unsigned TargetReloType : 6; // The target relocation ID AddressType AddrType : 4; // The field of Target to use - bool NeedStub : 1; // True if this relocation requires a stub + bool MayNeedFarStub : 1; // True if this relocation may require a far-stub bool GOTRelative : 1; // Should this relocation be relative to the GOT? bool TargetResolve : 1; // True if target should resolve the address @@ -81,7 +81,7 @@ public: /// static MachineRelocation getGV(uintptr_t offset, unsigned RelocationType, GlobalValue *GV, intptr_t cst = 0, - bool NeedStub = 0, + bool MayNeedFarStub = 0, bool GOTrelative = 0) { assert((RelocationType & ~63) == 0 && "Relocation type too large!"); MachineRelocation Result; @@ -89,7 +89,7 @@ public: Result.ConstantVal = cst; Result.TargetReloType = RelocationType; Result.AddrType = isGV; - Result.NeedStub = NeedStub; + Result.MayNeedFarStub = MayNeedFarStub; Result.GOTRelative = GOTrelative; Result.TargetResolve = false; Result.Target.GV = GV; @@ -101,7 +101,7 @@ public: static MachineRelocation getIndirectSymbol(uintptr_t offset, unsigned RelocationType, GlobalValue *GV, intptr_t cst = 0, - bool NeedStub = 0, + bool MayNeedFarStub = 0, bool GOTrelative = 0) { assert((RelocationType & ~63) == 0 && "Relocation type too large!"); MachineRelocation Result; @@ -109,7 +109,7 @@ public: Result.ConstantVal = cst; Result.TargetReloType = RelocationType; Result.AddrType = isIndirectSym; - Result.NeedStub = NeedStub; + Result.MayNeedFarStub = MayNeedFarStub; Result.GOTRelative = GOTrelative; Result.TargetResolve = false; Result.Target.GV = GV; @@ -126,7 +126,7 @@ public: Result.ConstantVal = cst; Result.TargetReloType = RelocationType; Result.AddrType = isBB; - Result.NeedStub = false; + Result.MayNeedFarStub = false; Result.GOTRelative = false; Result.TargetResolve = false; Result.Target.MBB = MBB; @@ -138,14 +138,15 @@ public: /// static MachineRelocation getExtSym(uintptr_t offset, unsigned RelocationType, const char *ES, intptr_t cst = 0, - bool GOTrelative = 0) { + bool GOTrelative = 0, + bool NeedStub = true) { assert((RelocationType & ~63) == 0 && "Relocation type too large!"); MachineRelocation Result; Result.Offset = offset; Result.ConstantVal = cst; Result.TargetReloType = RelocationType; Result.AddrType = isExtSym; - Result.NeedStub = true; + Result.MayNeedFarStub = NeedStub; Result.GOTRelative = GOTrelative; Result.TargetResolve = false; Result.Target.ExtSym = ES; @@ -164,7 +165,7 @@ public: Result.ConstantVal = cst; Result.TargetReloType = RelocationType; Result.AddrType = isConstPool; - Result.NeedStub = false; + Result.MayNeedFarStub = false; Result.GOTRelative = false; Result.TargetResolve = letTargetResolve; Result.Target.Index = CPI; @@ -183,7 +184,7 @@ public: Result.ConstantVal = cst; Result.TargetReloType = RelocationType; Result.AddrType = isJumpTable; - Result.NeedStub = false; + Result.MayNeedFarStub = false; Result.GOTRelative = false; Result.TargetResolve = letTargetResolve; Result.Target.Index = JTI; @@ -258,12 +259,14 @@ public: return GOTRelative; } - /// doesntNeedStub - This function returns true if the JIT for this target - /// target is capable of directly handling the relocated GlobalValue reference - /// without using either a stub function or issuing an extra load to get the - /// GV address. - bool doesntNeedStub() const { - return !NeedStub; + /// mayNeedFarStub - This function returns true if the JIT for this target may + /// need either a stub function or an indirect global-variable load to handle + /// the relocated GlobalValue reference. For example, the x86-64 call + /// instruction can only call functions within +/-2GB of the call site. + /// Anything farther away needs a longer mov+call sequence, which can't just + /// be written on top of the existing call. + bool mayNeedFarStub() const { + return MayNeedFarStub; } /// letTargetResolve - Return true if the target JITInfo is usually