[llvm] 3b55bfa - [llvm-jitlink] Add suppport for testing GOT entries and stubs for ELF.
Lang Hames via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 17 17:56:08 PDT 2020
Author: Lang Hames
Date: 2020-07-17T17:55:30-07:00
New Revision: 3b55bfad2a3b7dba8815e043fcd9a2c0cb7b2987
URL: https://github.com/llvm/llvm-project/commit/3b55bfad2a3b7dba8815e043fcd9a2c0cb7b2987
DIFF: https://github.com/llvm/llvm-project/commit/3b55bfad2a3b7dba8815e043fcd9a2c0cb7b2987.diff
LOG: [llvm-jitlink] Add suppport for testing GOT entries and stubs for ELF.
This enables regression testing of GOT and stub handling with
llvm-jitlink.
Added:
Modified:
llvm/tools/llvm-jitlink/llvm-jitlink-elf.cpp
llvm/tools/llvm-jitlink/llvm-jitlink-macho.cpp
Removed:
################################################################################
diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink-elf.cpp b/llvm/tools/llvm-jitlink/llvm-jitlink-elf.cpp
index 1b74f1016ae9..beb73fb8edf7 100644
--- a/llvm/tools/llvm-jitlink/llvm-jitlink-elf.cpp
+++ b/llvm/tools/llvm-jitlink/llvm-jitlink-elf.cpp
@@ -20,6 +20,50 @@
using namespace llvm;
using namespace llvm::jitlink;
+static bool isELFGOTSection(Section &S) { return S.getName() == "$__GOT"; }
+
+static bool isELFStubsSection(Section &S) { return S.getName() == "$__STUBS"; }
+
+static Expected<Edge &> getFirstRelocationEdge(LinkGraph &G, Block &B) {
+ auto EItr = std::find_if(B.edges().begin(), B.edges().end(),
+ [](Edge &E) { return E.isRelocation(); });
+ if (EItr == B.edges().end())
+ return make_error<StringError>("GOT entry in " + G.getName() + ", \"" +
+ B.getSection().getName() +
+ "\" has no relocations",
+ inconvertibleErrorCode());
+ return *EItr;
+}
+
+static Expected<Symbol &> getELFGOTTarget(LinkGraph &G, Block &B) {
+ auto E = getFirstRelocationEdge(G, B);
+ if (!E)
+ return E.takeError();
+ auto &TargetSym = E->getTarget();
+ if (!TargetSym.hasName())
+ return make_error<StringError>(
+ "GOT entry in " + G.getName() + ", \"" +
+ TargetSym.getBlock().getSection().getName() +
+ "\" points to anonymous "
+ "symbol",
+ inconvertibleErrorCode());
+ return TargetSym;
+}
+
+static Expected<Symbol &> getELFStubTarget(LinkGraph &G, Block &B) {
+ auto E = getFirstRelocationEdge(G, B);
+ if (!E)
+ return E.takeError();
+ auto &GOTSym = E->getTarget();
+ if (!GOTSym.isDefined() || !isELFGOTSection(GOTSym.getBlock().getSection()))
+ return make_error<StringError>(
+ "Stubs entry in " + G.getName() + ", \"" +
+ GOTSym.getBlock().getSection().getName() +
+ "\" does not point to GOT entry",
+ inconvertibleErrorCode());
+ return getELFGOTTarget(G, GOTSym.getBlock());
+}
+
namespace llvm {
Error registerELFGraphInfo(Session &S, LinkGraph &G) {
@@ -53,6 +97,9 @@ Error registerELFGraphInfo(Session &S, LinkGraph &G) {
"\"",
inconvertibleErrorCode());
+ bool isGOTSection = isELFGOTSection(Sec);
+ bool isStubsSection = isELFStubsSection(Sec);
+
bool SectionContainsContent = false;
bool SectionContainsZeroFill = false;
@@ -64,7 +111,29 @@ Error registerELFGraphInfo(Session &S, LinkGraph &G) {
if (Sym->getAddress() > LastSym->getAddress())
LastSym = Sym;
- if (Sym->hasName()) {
+ if (isGOTSection) {
+ if (Sym->isSymbolZeroFill())
+ return make_error<StringError>("zero-fill atom in GOT section",
+ inconvertibleErrorCode());
+
+ if (auto TS = getELFGOTTarget(G, Sym->getBlock()))
+ FileInfo.GOTEntryInfos[TS->getName()] = {Sym->getSymbolContent(),
+ Sym->getAddress()};
+ else
+ return TS.takeError();
+ SectionContainsContent = true;
+ } else if (isStubsSection) {
+ if (Sym->isSymbolZeroFill())
+ return make_error<StringError>("zero-fill atom in Stub section",
+ inconvertibleErrorCode());
+
+ if (auto TS = getELFStubTarget(G, Sym->getBlock()))
+ FileInfo.StubInfos[TS->getName()] = {Sym->getSymbolContent(),
+ Sym->getAddress()};
+ else
+ return TS.takeError();
+ SectionContainsContent = true;
+ } else if (Sym->hasName()) {
dbgs() << "Symbol: " << Sym->getName() << "\n";
if (Sym->isSymbolZeroFill()) {
S.SymbolInfos[Sym->getName()] = {Sym->getSize(), Sym->getAddress()};
diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink-macho.cpp b/llvm/tools/llvm-jitlink/llvm-jitlink-macho.cpp
index 18584e55d0f5..fc70934ea1d5 100644
--- a/llvm/tools/llvm-jitlink/llvm-jitlink-macho.cpp
+++ b/llvm/tools/llvm-jitlink/llvm-jitlink-macho.cpp
@@ -49,12 +49,6 @@ static Expected<Symbol &> getMachOGOTTarget(LinkGraph &G, Block &B) {
"\" points to anonymous "
"symbol",
inconvertibleErrorCode());
- if (TargetSym.isDefined() || TargetSym.isAbsolute())
- return make_error<StringError>(
- "GOT entry \"" + TargetSym.getName() + "\" in " + G.getName() + ", \"" +
- TargetSym.getBlock().getSection().getName() +
- "\" does not point to an external symbol",
- inconvertibleErrorCode());
return TargetSym;
}
More information about the llvm-commits
mailing list