[PATCH] D78168: [lld-macho][rfc] Have Symbol::getVA() return a non-relative virtual address

Jez Ng via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 14 16:52:41 PDT 2020


int3 created this revision.
int3 added reviewers: ruiu, pcc, MaskRay, smeenai, alexshap, gkm, Ktwu, christylee.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

Currently, getVA() returns a virtual address with the assumption that
the ImageBase is zero. As I understand, this is what lld-ELF is doing.
However, under our current design, it seems like an awkward setup --
I'm finding that I have to add and subtract ImageBase in several places
to make things work out.

As such, I think it's simpler to have getVA() return a non-relative VA,
but I'm not sure if I'm missing something. Would love to hear more from
folks familiar with lld-ELF.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D78168

Files:
  lld/MachO/ExportTrie.cpp
  lld/MachO/InputSection.cpp
  lld/MachO/Symbols.h


Index: lld/MachO/Symbols.h
===================================================================
--- lld/MachO/Symbols.h
+++ lld/MachO/Symbols.h
@@ -81,7 +81,7 @@
 
 inline uint64_t Symbol::getVA() const {
   if (auto *d = dyn_cast<Defined>(this))
-    return d->isec->addr + d->value - ImageBase;
+    return d->isec->addr + d->value;
   return 0;
 }
 
Index: lld/MachO/InputSection.cpp
===================================================================
--- lld/MachO/InputSection.cpp
+++ lld/MachO/InputSection.cpp
@@ -32,7 +32,7 @@
     uint64_t va = 0;
     if (auto *s = r.target.dyn_cast<Symbol *>()) {
       if (auto *dylibSymbol = dyn_cast<DylibSymbol>(s)) {
-        va = in.got->addr - ImageBase + dylibSymbol->gotIndex * WordSize;
+        va = in.got->addr + dylibSymbol->gotIndex * WordSize;
       } else {
         va = s->getVA();
       }
@@ -43,7 +43,7 @@
 
     uint64_t val = va + r.addend;
     if (1) // TODO: handle non-pcrel relocations
-      val -= addr - ImageBase + r.offset;
+      val -= addr + r.offset;
     target->relocateOne(buf + r.offset, r.type, val);
   }
 }
Index: lld/MachO/ExportTrie.cpp
===================================================================
--- lld/MachO/ExportTrie.cpp
+++ lld/MachO/ExportTrie.cpp
@@ -178,7 +178,7 @@
 
   if (isTerminal) {
     assert(j - i == 1); // no duplicate symbols
-    node->info = {pivotSymbol->getVA() + ImageBase};
+    node->info = {pivotSymbol->getVA()};
   } else {
     // This is the tail-call-optimized version of the following call:
     // multikeySort(vec.slice(i, j - i), lastPos, pos + 1, node);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D78168.257556.patch
Type: text/x-patch
Size: 1594 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200414/d5e3a9f0/attachment.bin>


More information about the llvm-commits mailing list