From: Lang Hames Date: Wed, 22 Apr 2015 21:38:37 +0000 (+0000) Subject: [RuntimeDyld][COFF] Add external symbol resolution support to RuntimeDyldCOFF. X-Git-Tag: llvmorg-3.7.0-rc1~6212 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=34cfa49b66906c8a090d9b5d121aa729b97c1aef;p=platform%2Fupstream%2Fllvm.git [RuntimeDyld][COFF] Add external symbol resolution support to RuntimeDyldCOFF. Patch by Andy Ayers. Thanks Andy! llvm-svn: 235554 --- diff --git a/llvm/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldCOFFX86_64.h b/llvm/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldCOFFX86_64.h index cd534a1..478665e 100644 --- a/llvm/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldCOFFX86_64.h +++ b/llvm/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldCOFFX86_64.h @@ -114,23 +114,15 @@ public: const ObjectFile &Obj, ObjSectionToIDMap &ObjSectionToID, StubMap &Stubs) override { - // Find the symbol referred to in the relocation, and - // get its section and offset. - // - // Insist for now that all symbols be resolvable within - // the scope of this object file. + // If possible, find the symbol referred to in the relocation, + // and the section that contains it. symbol_iterator Symbol = RelI->getSymbol(); if (Symbol == Obj.symbol_end()) report_fatal_error("Unknown symbol in relocation"); - unsigned TargetSectionID = 0; - uint64_t TargetOffset = UnknownAddressOrSize; section_iterator SecI(Obj.section_end()); Symbol->getSection(SecI); - if (SecI == Obj.section_end()) - report_fatal_error("Unknown section in relocation"); - bool IsCode = SecI->isText(); - TargetSectionID = findOrEmitSection(Obj, *SecI, IsCode, ObjSectionToID); - TargetOffset = getSymbolOffset(*Symbol); + // If there is no section, this must be an external reference. + const bool IsExtern = SecI == Obj.section_end(); // Determine the Addend used to adjust the relocation value. uint64_t RelType; @@ -167,12 +159,22 @@ public: StringRef TargetName; Symbol->getName(TargetName); + DEBUG(dbgs() << "\t\tIn Section " << SectionID << " Offset " << Offset << " RelType: " << RelType << " TargetName: " << TargetName << " Addend " << Addend << "\n"); - RelocationEntry RE(SectionID, Offset, RelType, TargetOffset + Addend); - addRelocationForSection(RE, TargetSectionID); + if (IsExtern) { + RelocationEntry RE(SectionID, Offset, RelType, Addend); + addRelocationForSymbol(RE, TargetName); + } else { + bool IsCode = SecI->isText(); + unsigned TargetSectionID = + findOrEmitSection(Obj, *SecI, IsCode, ObjSectionToID); + uint64_t TargetOffset = getSymbolOffset(*Symbol); + RelocationEntry RE(SectionID, Offset, RelType, TargetOffset + Addend); + addRelocationForSection(RE, TargetSectionID); + } return ++RelI; }