diff --git a/llvm/include/llvm/Object/COFFYAML.h b/llvm/include/llvm/Object/COFFYAML.h index 7e8aefa0500c..3fa3ec6c124b 100644 --- a/llvm/include/llvm/Object/COFFYAML.h +++ b/llvm/include/llvm/Object/COFFYAML.h @@ -35,11 +35,17 @@ inline SectionCharacteristics operator|(SectionCharacteristics a, // The structure of the yaml files is not an exact 1:1 match to COFF. In order // to use yaml::IO, we use these structures which are closer to the source. namespace COFFYAML { + struct Relocation { + uint32_t VirtualAddress; + uint16_t Type; + StringRef SymbolName; + }; + struct Section { COFF::section Header; unsigned Alignment; object::yaml::BinaryRef SectionData; - std::vector Relocations; + std::vector Relocations; StringRef Name; Section(); }; @@ -64,7 +70,7 @@ namespace COFFYAML { LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Section) LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Symbol) -LLVM_YAML_IS_SEQUENCE_VECTOR(COFF::relocation) +LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Relocation) namespace llvm { namespace yaml { @@ -105,8 +111,8 @@ struct ScalarBitSetTraits { }; template <> -struct MappingTraits { - static void mapping(IO &IO, COFF::relocation &Rel); +struct MappingTraits { + static void mapping(IO &IO, COFFYAML::Relocation &Rel); }; template <> diff --git a/llvm/lib/Object/COFFYAML.cpp b/llvm/lib/Object/COFFYAML.cpp index e3c2a45977c1..e549b4e9ea25 100644 --- a/llvm/lib/Object/COFFYAML.cpp +++ b/llvm/lib/Object/COFFYAML.cpp @@ -229,11 +229,12 @@ struct NType { } -void MappingTraits::mapping(IO &IO, COFF::relocation &Rel) { +void MappingTraits::mapping(IO &IO, + COFFYAML::Relocation &Rel) { MappingNormalization NT(IO, Rel.Type); IO.mapRequired("VirtualAddress", Rel.VirtualAddress); - IO.mapRequired("SymbolTableIndex", Rel.SymbolTableIndex); + IO.mapRequired("SymbolName", Rel.SymbolName); IO.mapRequired("Type", NT->Type); } diff --git a/llvm/test/Object/Inputs/COFF/i386.yaml b/llvm/test/Object/Inputs/COFF/i386.yaml index f7631821c192..1badad8d5915 100644 --- a/llvm/test/Object/Inputs/COFF/i386.yaml +++ b/llvm/test/Object/Inputs/COFF/i386.yaml @@ -12,17 +12,17 @@ sections: Relocations: - !Relocation VirtualAddress: 0xe - SymbolTableIndex: 5 + SymbolName: L_.str Type: IMAGE_REL_I386_DIR32 - !Relocation VirtualAddress: 0x13 - SymbolTableIndex: 6 + SymbolName: _puts Type: IMAGE_REL_I386_REL32 - !Relocation VirtualAddress: 0x18 - SymbolTableIndex: 7 + SymbolName: _SomeOtherFunction Type: IMAGE_REL_I386_REL32 - !Section diff --git a/llvm/test/Object/Inputs/COFF/x86-64.yaml b/llvm/test/Object/Inputs/COFF/x86-64.yaml index 5134071cda41..b775ae9cdfbd 100644 --- a/llvm/test/Object/Inputs/COFF/x86-64.yaml +++ b/llvm/test/Object/Inputs/COFF/x86-64.yaml @@ -11,17 +11,17 @@ sections: Relocations: - !Relocation VirtualAddress: 0xf - SymbolTableIndex: 5 + SymbolName: L.str Type: IMAGE_REL_AMD64_REL32 - !Relocation VirtualAddress: 0x14 - SymbolTableIndex: 6 + SymbolName: puts Type: IMAGE_REL_AMD64_REL32 - !Relocation VirtualAddress: 0x19 - SymbolTableIndex: 7 + SymbolName: SomeOtherFunction Type: IMAGE_REL_AMD64_REL32 - !Section diff --git a/llvm/test/Object/obj2yaml.test b/llvm/test/Object/obj2yaml.test index 6c87268801f3..49541336c682 100644 --- a/llvm/test/Object/obj2yaml.test +++ b/llvm/test/Object/obj2yaml.test @@ -13,15 +13,15 @@ COFF-I386-NEXT: SectionData: 83EC0CC744240800000000C7042400000000E800000000E COFF-I386: Relocations: COFF-I386-NEXT: - VirtualAddress: 14 -COFF-I386-NEXT: SymbolTableIndex: 5 +COFF-I386-NEXT: SymbolName: L_.str COFF-I386-NEXT: Type: IMAGE_REL_I386_DIR32 COFF-I386: - VirtualAddress: 19 -COFF-I386-NEXT: SymbolTableIndex: 6 +COFF-I386-NEXT: SymbolName: _puts COFF-I386-NEXT: Type: IMAGE_REL_I386_REL32 COFF-I386: - VirtualAddress: 24 -COFF-I386-NEXT: SymbolTableIndex: 7 +COFF-I386-NEXT: SymbolName: _SomeOtherFunction COFF-I386-NEXT: Type: IMAGE_REL_I386_REL32 COFF-I386: - Name: .data @@ -88,15 +88,15 @@ COFF-X86-64-NEXT: SectionData: 4883EC28C744242400000000488D0D00000000E800000 COFF-X86-64: Relocations: COFF-X86-64-NEXT: - VirtualAddress: 15 -COFF-X86-64-NEXT: SymbolTableIndex: 5 +COFF-X86-64-NEXT: SymbolName: L.str COFF-X86-64-NEXT: Type: IMAGE_REL_AMD64_REL32 COFF-X86-64: - VirtualAddress: 20 -COFF-X86-64-NEXT: SymbolTableIndex: 6 +COFF-X86-64-NEXT: SymbolName: puts COFF-X86-64-NEXT: Type: IMAGE_REL_AMD64_REL32 COFF-X86-64: - VirtualAddress: 25 -COFF-X86-64-NEXT: SymbolTableIndex: 7 +COFF-X86-64-NEXT: SymbolName: SomeOtherFunction COFF-X86-64-NEXT: Type: IMAGE_REL_AMD64_REL32 COFF-X86-64: - Name: .data diff --git a/llvm/tools/obj2yaml/coff2yaml.cpp b/llvm/tools/obj2yaml/coff2yaml.cpp index 909b269385bf..0ec35bfc7e33 100644 --- a/llvm/tools/obj2yaml/coff2yaml.cpp +++ b/llvm/tools/obj2yaml/coff2yaml.cpp @@ -66,13 +66,15 @@ void COFFDumper::dumpSections(unsigned NumSections) { Obj.getSectionContents(Sect, sectionData); Sec.SectionData = object::yaml::BinaryRef(sectionData); - std::vector Relocations; + std::vector Relocations; for (object::relocation_iterator rIter = iter->begin_relocations(); rIter != iter->end_relocations(); rIter.increment(ec)) { const object::coff_relocation *reloc = Obj.getCOFFRelocation(rIter); - COFF::relocation Rel; + COFFYAML::Relocation Rel; + object::symbol_iterator Sym = rIter->getSymbol(); + StringRef Name; + Sym->getName(Rel.SymbolName); Rel.VirtualAddress = reloc->VirtualAddress; - Rel.SymbolTableIndex = reloc->SymbolTableIndex; Rel.Type = reloc->Type; Relocations.push_back(Rel); } diff --git a/llvm/tools/yaml2obj/yaml2coff.cpp b/llvm/tools/yaml2obj/yaml2coff.cpp index d800b90791cf..11aae0e68b6b 100644 --- a/llvm/tools/yaml2obj/yaml2coff.cpp +++ b/llvm/tools/yaml2obj/yaml2coff.cpp @@ -219,15 +219,25 @@ bool writeCOFF(COFFParser &CP, raw_ostream &OS) { << binary_le(i->Header.Characteristics); } + unsigned CurSymbol = 0; + StringMap SymbolTableIndexMap; + for (std::vector::iterator I = CP.Obj.Symbols.begin(), + E = CP.Obj.Symbols.end(); + I != E; ++I) { + SymbolTableIndexMap[I->Name] = CurSymbol; + CurSymbol += 1 + I->Header.NumberOfAuxSymbols; + } + // Output section data. for (std::vector::iterator i = CP.Obj.Sections.begin(), e = CP.Obj.Sections.end(); i != e; ++i) { i->SectionData.writeAsBinary(OS); for (unsigned I2 = 0, E2 = i->Relocations.size(); I2 != E2; ++I2) { - const COFF::relocation &R = i->Relocations[I2]; + const COFFYAML::Relocation &R = i->Relocations[I2]; + uint32_t SymbolTableIndex = SymbolTableIndexMap[R.SymbolName]; OS << binary_le(R.VirtualAddress) - << binary_le(R.SymbolTableIndex) + << binary_le(SymbolTableIndex) << binary_le(R.Type); } }