Add comment on AMDGPU that the difference has no obvious reason.
authorRui Ueyama <ruiu@google.com>
Fri, 26 Feb 2016 15:39:26 +0000 (15:39 +0000)
committerRui Ueyama <ruiu@google.com>
Fri, 26 Feb 2016 15:39:26 +0000 (15:39 +0000)
llvm-svn: 262026

lld/ELF/OutputSections.cpp
lld/ELF/Symbols.cpp

index 472eda9..f17d705 100644 (file)
@@ -1456,8 +1456,11 @@ void SymbolTableSection<ELFT>::writeLocalSymbols(uint8_t *&Buf) {
         const OutputSectionBase<ELFT> *OutSec = Section->OutSec;
         ESym->st_shndx = OutSec->SectionIndex;
         VA = Section->getOffset(*Sym);
-        // Symbol offsets for AMDGPU need to be the offset in bytes of the
-        // symbol from the beginning of the section.
+
+        // Symbol offsets for AMDGPU are the offsets in bytes of the
+        // symbols from the beginning of the section. There seems to be no
+        // reason for that deviation -- it's just that the definition of
+        // st_value field in AMDGPU's ELF is odd.
         if (Config->EMachine != EM_AMDGPU)
           VA += OutSec->getVA();
       }
index bd6f6b4..125e6c7 100644 (file)
@@ -44,10 +44,12 @@ typename ELFFile<ELFT>::uintX_t SymbolBody::getVA() const {
       return D->Sym.st_value;
     assert(SC->Live);
 
-    // Symbol offsets for AMDGPU need to be the offset in bytes of the symbol
-    // from the beginning of the section.
+    // Symbol offsets for AMDGPU are the offsets in bytes of the symbols
+    // from the beginning of the section. Note that this part of AMDGPU's
+    // ELF spec is odd and not in line with the standard ELF.
     if (Config->EMachine == EM_AMDGPU)
       return SC->getOffset(D->Sym);
+
     if (D->Sym.getType() == STT_TLS)
       return SC->OutSec->getVA() + SC->getOffset(D->Sym) -
              Out<ELFT>::TlsPhdr->p_vaddr;