14c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar//===-- RuntimeDyldCOFFX86_64.h --- COFF/X86_64 specific code ---*- C++ -*-===// 24c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar// 34c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar// The LLVM Compiler Infrastructure 44c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar// 54c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source 64c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar// License. See LICENSE.TXT for details. 74c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar// 84c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar//===----------------------------------------------------------------------===// 94c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar// 104c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar// COFF x86_x64 support for MC-JIT runtime dynamic linker. 114c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar// 124c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar//===----------------------------------------------------------------------===// 134c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 144c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#ifndef LLVM_LIB_EXECUTIONENGINE_RUNTIMEDYLD_TARGETS_RUNTIMEDYLDCOFF86_64_H 154c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#define LLVM_LIB_EXECUTIONENGINE_RUNTIMEDYLD_TARGETS_RUNTIMEDYLDCOFF86_64_H 164c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 174c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "llvm/Object/COFF.h" 184c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "llvm/Support/COFF.h" 194c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "../RuntimeDyldCOFF.h" 204c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 214c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#define DEBUG_TYPE "dyld" 224c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 234c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarnamespace llvm { 244c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 254c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarclass RuntimeDyldCOFFX86_64 : public RuntimeDyldCOFF { 264c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 274c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarprivate: 284c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // When a module is loaded we save the SectionID of the unwind 294c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // sections in a table until we receive a request to register all 304c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // unregisteredEH frame sections with the memory manager. 314c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar SmallVector<SID, 2> UnregisteredEHFrameSections; 324c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar SmallVector<SID, 2> RegisteredEHFrameSections; 334c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 344c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarpublic: 350c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar RuntimeDyldCOFFX86_64(RuntimeDyld::MemoryManager &MM, 360c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar RuntimeDyld::SymbolResolver &Resolver) 370c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar : RuntimeDyldCOFF(MM, Resolver) {} 384c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 394c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar unsigned getMaxStubSize() override { 404c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar return 6; // 2-byte jmp instruction + 32-bit relative address 414c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar } 424c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 434c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // The target location for the relocation is described by RE.SectionID and 444c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // RE.Offset. RE.SectionID can be used to find the SectionEntry. Each 454c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // SectionEntry has three members describing its location. 464c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // SectionEntry::Address is the address at which the section has been loaded 474c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // into memory in the current (host) process. SectionEntry::LoadAddress is 484c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // the address that the section will have in the target process. 494c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // SectionEntry::ObjAddress is the address of the bits for this section in the 504c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // original emitted object image (also in the current address space). 514c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // 524c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // Relocations will be applied as if the section were loaded at 534c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // SectionEntry::LoadAddress, but they will be applied at an address based 544c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // on SectionEntry::Address. SectionEntry::ObjAddress will be used to refer 554c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // to Target memory contents if they are required for value calculations. 564c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // 574c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // The Value parameter here is the load address of the symbol for the 584c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // relocation to be applied. For relocations which refer to symbols in the 594c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // current object Value will be the LoadAddress of the section in which 604c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // the symbol resides (RE.Addend provides additional information about the 614c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // symbol location). For external symbols, Value will be the address of the 624c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // symbol in the target address space. 634c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar void resolveRelocation(const RelocationEntry &RE, uint64_t Value) override { 644c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar const SectionEntry &Section = Sections[RE.SectionID]; 65f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar uint8_t *Target = Section.getAddressWithOffset(RE.Offset); 664c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 674c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar switch (RE.RelType) { 684c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 694c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar case COFF::IMAGE_REL_AMD64_REL32: 704c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar case COFF::IMAGE_REL_AMD64_REL32_1: 714c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar case COFF::IMAGE_REL_AMD64_REL32_2: 724c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar case COFF::IMAGE_REL_AMD64_REL32_3: 734c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar case COFF::IMAGE_REL_AMD64_REL32_4: 744c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar case COFF::IMAGE_REL_AMD64_REL32_5: { 75f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar uint64_t FinalAddress = Section.getLoadAddressWithOffset(RE.Offset); 764c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // Delta is the distance from the start of the reloc to the end of the 774c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // instruction with the reloc. 784c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar uint64_t Delta = 4 + (RE.RelType - COFF::IMAGE_REL_AMD64_REL32); 794c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar Value -= FinalAddress + Delta; 804c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar uint64_t Result = Value + RE.Addend; 814c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar assert(((int64_t)Result <= INT32_MAX) && "Relocation overflow"); 824c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar assert(((int64_t)Result >= INT32_MIN) && "Relocation underflow"); 83f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar writeBytesUnaligned(Result, Target, 4); 844c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar break; 854c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar } 864c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 874c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar case COFF::IMAGE_REL_AMD64_ADDR32NB: { 884c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // Note ADDR32NB requires a well-established notion of 894c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // image base. This address must be less than or equal 904c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // to every section's load address, and all sections must be 914c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // within a 32 bit offset from the base. 924c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // 934c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // For now we just set these to zero. 94f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar writeBytesUnaligned(0, Target, 4); 954c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar break; 964c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar } 974c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 984c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar case COFF::IMAGE_REL_AMD64_ADDR64: { 99f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar writeBytesUnaligned(Value + RE.Addend, Target, 8); 1004c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar break; 1014c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar } 1024c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 1034c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar default: 1044c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar llvm_unreachable("Relocation type not implemented yet!"); 1054c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar break; 1064c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar } 1074c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar } 1084c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 109de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Expected<relocation_iterator> 110de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar processRelocationRef(unsigned SectionID, 111de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar relocation_iterator RelI, 112de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const ObjectFile &Obj, 113de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ObjSectionToIDMap &ObjSectionToID, 114de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar StubMap &Stubs) override { 1156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // If possible, find the symbol referred to in the relocation, 1166948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // and the section that contains it. 1174c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar symbol_iterator Symbol = RelI->getSymbol(); 1184c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar if (Symbol == Obj.symbol_end()) 1194c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar report_fatal_error("Unknown symbol in relocation"); 120de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto SectionOrError = Symbol->getSection(); 121de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (!SectionOrError) 122de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return SectionOrError.takeError(); 123de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar section_iterator SecI = *SectionOrError; 1246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // If there is no section, this must be an external reference. 1256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const bool IsExtern = SecI == Obj.section_end(); 1264c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 1274c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // Determine the Addend used to adjust the relocation value. 128f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar uint64_t RelType = RelI->getType(); 129f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar uint64_t Offset = RelI->getOffset(); 1304c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar uint64_t Addend = 0; 1314c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar SectionEntry &Section = Sections[SectionID]; 132f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar uintptr_t ObjTarget = Section.getObjAddress() + Offset; 1334c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 1344c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar switch (RelType) { 1354c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 1364c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar case COFF::IMAGE_REL_AMD64_REL32: 1374c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar case COFF::IMAGE_REL_AMD64_REL32_1: 1384c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar case COFF::IMAGE_REL_AMD64_REL32_2: 1394c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar case COFF::IMAGE_REL_AMD64_REL32_3: 1404c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar case COFF::IMAGE_REL_AMD64_REL32_4: 1414c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar case COFF::IMAGE_REL_AMD64_REL32_5: 1424c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar case COFF::IMAGE_REL_AMD64_ADDR32NB: { 143f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar uint8_t *Displacement = (uint8_t *)ObjTarget; 144f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Addend = readBytesUnaligned(Displacement, 4); 1454c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar break; 1464c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar } 1474c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 1484c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar case COFF::IMAGE_REL_AMD64_ADDR64: { 149f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar uint8_t *Displacement = (uint8_t *)ObjTarget; 150f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Addend = readBytesUnaligned(Displacement, 8); 1514c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar break; 1524c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar } 1534c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 1544c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar default: 1554c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar break; 1564c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar } 1574c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 158de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Expected<StringRef> TargetNameOrErr = Symbol->getName(); 159de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (!TargetNameOrErr) 160de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return TargetNameOrErr.takeError(); 161f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar StringRef TargetName = *TargetNameOrErr; 1626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 1634c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar DEBUG(dbgs() << "\t\tIn Section " << SectionID << " Offset " << Offset 1644c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar << " RelType: " << RelType << " TargetName: " << TargetName 1654c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar << " Addend " << Addend << "\n"); 1664c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 1676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (IsExtern) { 1686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar RelocationEntry RE(SectionID, Offset, RelType, Addend); 1696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar addRelocationForSymbol(RE, TargetName); 1706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } else { 1716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool IsCode = SecI->isText(); 172de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar unsigned TargetSectionID; 173de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (auto TargetSectionIDOrErr = 174de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar findOrEmitSection(Obj, *SecI, IsCode, ObjSectionToID)) 175de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar TargetSectionID = *TargetSectionIDOrErr; 176de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar else 177de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return TargetSectionIDOrErr.takeError(); 1786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar uint64_t TargetOffset = getSymbolOffset(*Symbol); 1796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar RelocationEntry RE(SectionID, Offset, RelType, TargetOffset + Addend); 1806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar addRelocationForSection(RE, TargetSectionID); 1816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 1824c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 1834c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar return ++RelI; 1844c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar } 1854c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 1864c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar unsigned getStubAlignment() override { return 1; } 1874c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar void registerEHFrames() override { 1884c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar for (auto const &EHFrameSID : UnregisteredEHFrameSections) { 189f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar uint8_t *EHFrameAddr = Sections[EHFrameSID].getAddress(); 190f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar uint64_t EHFrameLoadAddr = Sections[EHFrameSID].getLoadAddress(); 191f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar size_t EHFrameSize = Sections[EHFrameSID].getSize(); 1920c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar MemMgr.registerEHFrames(EHFrameAddr, EHFrameLoadAddr, EHFrameSize); 1934c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar RegisteredEHFrameSections.push_back(EHFrameSID); 1944c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar } 1954c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar UnregisteredEHFrameSections.clear(); 1964c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar } 1974c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar void deregisterEHFrames() override { 1984c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // Stub 1994c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar } 200de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Error finalizeLoad(const ObjectFile &Obj, 201de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ObjSectionToIDMap &SectionMap) override { 2024c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // Look for and record the EH frame section IDs. 2034c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar for (const auto &SectionPair : SectionMap) { 2044c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar const SectionRef &Section = SectionPair.first; 2054c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar StringRef Name; 206de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (auto EC = Section.getName(Name)) 207de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return errorCodeToError(EC); 2084c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // Note unwind info is split across .pdata and .xdata, so this 2094c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // may not be sufficiently general for all users. 2104c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar if (Name == ".xdata") { 2114c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar UnregisteredEHFrameSections.push_back(SectionPair.second); 2124c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar } 2134c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar } 214de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return Error::success(); 2154c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar } 2164c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar}; 2174c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 2184c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar} // end namespace llvm 2194c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 2204c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#undef DEBUG_TYPE 2214c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 2224c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#endif 223