aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/ExecutionEngine
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/ExecutionEngine')
-rw-r--r--llvm/lib/ExecutionEngine/JITLink/ELFLinkGraphBuilder.h23
-rw-r--r--llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp13
2 files changed, 28 insertions, 8 deletions
diff --git a/llvm/lib/ExecutionEngine/JITLink/ELFLinkGraphBuilder.h b/llvm/lib/ExecutionEngine/JITLink/ELFLinkGraphBuilder.h
index 26feb8e..9d2d495 100644
--- a/llvm/lib/ExecutionEngine/JITLink/ELFLinkGraphBuilder.h
+++ b/llvm/lib/ExecutionEngine/JITLink/ELFLinkGraphBuilder.h
@@ -112,6 +112,17 @@ protected:
Expected<std::pair<Linkage, Scope>>
getSymbolLinkageAndScope(const typename ELFT::Sym &Sym, StringRef Name);
+ /// Set the target flags on the given Symbol.
+ virtual TargetFlagsType makeTargetFlags(const typename ELFT::Sym &Sym) {
+ return TargetFlagsType{};
+ }
+
+ /// Get the physical offset of the symbol on the target platform.
+ virtual orc::ExecutorAddrDiff getRawOffset(const typename ELFT::Sym &Sym,
+ TargetFlagsType Flags) {
+ return Sym.getValue();
+ }
+
Error prepare();
Error graphifySections();
Error graphifySymbols();
@@ -478,6 +489,9 @@ template <typename ELFT> Error ELFLinkGraphBuilder<ELFT>::graphifySymbols() {
<< "\"\n";
});
+ TargetFlagsType Flags = makeTargetFlags(Sym);
+ orc::ExecutorAddrDiff Offset = getRawOffset(Sym, Flags);
+
// In RISCV, temporary symbols (Used to generate dwarf, eh_frame
// sections...) will appear in object code's symbol table, and LLVM does
// not use names on these temporary symbols (RISCV gnu toolchain uses
@@ -485,10 +499,13 @@ template <typename ELFT> Error ELFLinkGraphBuilder<ELFT>::graphifySymbols() {
// anonymous symbol.
auto &GSym =
Name->empty()
- ? G->addAnonymousSymbol(*B, Sym.getValue(), Sym.st_size,
+ ? G->addAnonymousSymbol(*B, Offset, Sym.st_size,
false, false)
- : G->addDefinedSymbol(*B, Sym.getValue(), *Name, Sym.st_size, L,
- S, Sym.getType() == ELF::STT_FUNC, false);
+ : G->addDefinedSymbol(*B, Offset, *Name, Sym.st_size, L,
+ S, Sym.getType() == ELF::STT_FUNC,
+ false);
+
+ GSym.setTargetFlags(Flags);
setGraphSymbol(SymIndex, GSym);
}
} else if (Sym.isUndefined() && Sym.isExternal()) {
diff --git a/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp b/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp
index e7356e5..2c270cd 100644
--- a/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp
@@ -39,6 +39,10 @@ bool hasInitializerSection(jitlink::LinkGraph &G) {
return false;
}
+JITTargetAddress getJITSymbolPtrForSymbol(Symbol &Sym) {
+ return Sym.getAddress().getValue();
+}
+
JITSymbolFlags getJITSymbolFlagsForSymbol(Symbol &Sym) {
JITSymbolFlags Flags;
@@ -215,10 +219,9 @@ public:
for (auto *Sym : G.defined_symbols())
if (Sym->hasName() && Sym->getScope() != Scope::Local) {
auto InternedName = ES.intern(Sym->getName());
+ auto Ptr = getJITSymbolPtrForSymbol(*Sym);
auto Flags = getJITSymbolFlagsForSymbol(*Sym);
-
- InternedResult[InternedName] =
- JITEvaluatedSymbol(Sym->getAddress().getValue(), Flags);
+ InternedResult[InternedName] = JITEvaluatedSymbol(Ptr, Flags);
if (AutoClaim && !MR->getSymbols().count(InternedName)) {
assert(!ExtraSymbolsToClaim.count(InternedName) &&
"Duplicate symbol to claim?");
@@ -229,9 +232,9 @@ public:
for (auto *Sym : G.absolute_symbols())
if (Sym->hasName() && Sym->getScope() != Scope::Local) {
auto InternedName = ES.intern(Sym->getName());
+ auto Ptr = getJITSymbolPtrForSymbol(*Sym);
auto Flags = getJITSymbolFlagsForSymbol(*Sym);
- InternedResult[InternedName] =
- JITEvaluatedSymbol(Sym->getAddress().getValue(), Flags);
+ InternedResult[InternedName] = JITEvaluatedSymbol(Ptr, Flags);
if (AutoClaim && !MR->getSymbols().count(InternedName)) {
assert(!ExtraSymbolsToClaim.count(InternedName) &&
"Duplicate symbol to claim?");