mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-23 14:25:07 +00:00
X86: Form IMGREL relocations for LLVM Functions
We supported forming IMGREL relocations from ConstantExprs involving __ImageBase if the minuend was a GlobalVariable. Extend this functionality to all GlobalObjects. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@231456 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -96,14 +96,12 @@ const MCExpr *X86WindowsTargetObjectFile::getExecutableRelativeSymbol(
|
|||||||
SubRHS->getPointerAddressSpace() != 0)
|
SubRHS->getPointerAddressSpace() != 0)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
// Both ptrtoint instructions must wrap global variables:
|
// Both ptrtoint instructions must wrap global objects:
|
||||||
// - Only global variables are eligible for image relative relocations.
|
// - Only global variables are eligible for image relative relocations.
|
||||||
// - The subtrahend refers to the special symbol __ImageBase, a global.
|
// - The subtrahend refers to the special symbol __ImageBase, a GlobalVariable.
|
||||||
const GlobalVariable *GVLHS =
|
const auto *GOLHS = dyn_cast<GlobalObject>(SubLHS->getPointerOperand());
|
||||||
dyn_cast<GlobalVariable>(SubLHS->getPointerOperand());
|
const auto *GVRHS = dyn_cast<GlobalVariable>(SubRHS->getPointerOperand());
|
||||||
const GlobalVariable *GVRHS =
|
if (!GOLHS || !GVRHS)
|
||||||
dyn_cast<GlobalVariable>(SubRHS->getPointerOperand());
|
|
||||||
if (!GVLHS || !GVRHS)
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
// We expect __ImageBase to be a global variable without a section, externally
|
// We expect __ImageBase to be a global variable without a section, externally
|
||||||
@@ -116,10 +114,10 @@ const MCExpr *X86WindowsTargetObjectFile::getExecutableRelativeSymbol(
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
// An image-relative, thread-local, symbol makes no sense.
|
// An image-relative, thread-local, symbol makes no sense.
|
||||||
if (GVLHS->isThreadLocal())
|
if (GOLHS->isThreadLocal())
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
return MCSymbolRefExpr::Create(TM.getSymbol(GVLHS, Mang),
|
return MCSymbolRefExpr::Create(TM.getSymbol(GOLHS, Mang),
|
||||||
MCSymbolRefExpr::VK_COFF_IMGREL32,
|
MCSymbolRefExpr::VK_COFF_IMGREL32,
|
||||||
getContext());
|
getContext());
|
||||||
}
|
}
|
||||||
|
@@ -4,3 +4,8 @@
|
|||||||
|
|
||||||
; X64: .quad "?x@@3HA"@IMGREL
|
; X64: .quad "?x@@3HA"@IMGREL
|
||||||
@"\01?x@@3HA" = global i64 sub nsw (i64 ptrtoint (i64* @"\01?x@@3HA" to i64), i64 ptrtoint (i8* @__ImageBase to i64)), align 8
|
@"\01?x@@3HA" = global i64 sub nsw (i64 ptrtoint (i64* @"\01?x@@3HA" to i64), i64 ptrtoint (i8* @__ImageBase to i64)), align 8
|
||||||
|
|
||||||
|
declare void @f()
|
||||||
|
|
||||||
|
; X64: .quad f@IMGREL
|
||||||
|
@fp = global i64 sub nsw (i64 ptrtoint (void ()* @f to i64), i64 ptrtoint (i8* @__ImageBase to i64)), align 8
|
||||||
|
Reference in New Issue
Block a user