From e3a0e7f29dde261ca00835e763e26de41a8684f6 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Thu, 6 Jun 2013 13:06:17 +0000 Subject: [PATCH] Print symbol names in relocations when dumping COFF as YAML. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@183403 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Object/COFFYAML.h | 14 ++++++++++---- lib/Object/COFFYAML.cpp | 5 +++-- test/Object/Inputs/COFF/i386.yaml | 6 +++--- test/Object/Inputs/COFF/x86-64.yaml | 6 +++--- test/Object/obj2yaml.test | 12 ++++++------ tools/obj2yaml/coff2yaml.cpp | 8 +++++--- tools/yaml2obj/yaml2coff.cpp | 14 ++++++++++++-- 7 files changed, 42 insertions(+), 23 deletions(-) diff --git a/include/llvm/Object/COFFYAML.h b/include/llvm/Object/COFFYAML.h index 7e8aefa0500..3fa3ec6c124 100644 --- a/include/llvm/Object/COFFYAML.h +++ b/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/lib/Object/COFFYAML.cpp b/lib/Object/COFFYAML.cpp index e3c2a45977c..e549b4e9ea2 100644 --- a/lib/Object/COFFYAML.cpp +++ b/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/test/Object/Inputs/COFF/i386.yaml b/test/Object/Inputs/COFF/i386.yaml index f7631821c19..1badad8d591 100644 --- a/test/Object/Inputs/COFF/i386.yaml +++ b/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/test/Object/Inputs/COFF/x86-64.yaml b/test/Object/Inputs/COFF/x86-64.yaml index 5134071cda4..b775ae9cdfb 100644 --- a/test/Object/Inputs/COFF/x86-64.yaml +++ b/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/test/Object/obj2yaml.test b/test/Object/obj2yaml.test index 6c87268801f..49541336c68 100644 --- a/test/Object/obj2yaml.test +++ b/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/tools/obj2yaml/coff2yaml.cpp b/tools/obj2yaml/coff2yaml.cpp index 909b269385b..0ec35bfc7e3 100644 --- a/tools/obj2yaml/coff2yaml.cpp +++ b/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/tools/yaml2obj/yaml2coff.cpp b/tools/yaml2obj/yaml2coff.cpp index d800b90791c..11aae0e68b6 100644 --- a/tools/yaml2obj/yaml2coff.cpp +++ b/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); } }