Print symbol names in relocations when dumping COFF as YAML.
authorRafael Espindola <rafael.espindola@gmail.com>
Thu, 6 Jun 2013 13:06:17 +0000 (13:06 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Thu, 6 Jun 2013 13:06:17 +0000 (13:06 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@183403 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Object/COFFYAML.h
lib/Object/COFFYAML.cpp
test/Object/Inputs/COFF/i386.yaml
test/Object/Inputs/COFF/x86-64.yaml
test/Object/obj2yaml.test
tools/obj2yaml/coff2yaml.cpp
tools/yaml2obj/yaml2coff.cpp

index 7e8aefa0500ccfec418135a1df82cb2b21ee4318..3fa3ec6c124b131c745fdba21f19068d298178c4 100644 (file)
@@ -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<COFF::relocation> Relocations;
+    std::vector<Relocation> 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<COFF::SectionCharacteristics> {
 };
 
 template <>
-struct MappingTraits<COFF::relocation> {
-  static void mapping(IO &IO, COFF::relocation &Rel);
+struct MappingTraits<COFFYAML::Relocation> {
+  static void mapping(IO &IO, COFFYAML::Relocation &Rel);
 };
 
 template <>
index e3c2a45977c136498751257bbd21f7f1d6f98862..e549b4e9ea258b54b9fdd9092291b5c64473c491 100644 (file)
@@ -229,11 +229,12 @@ struct NType {
 
 }
 
-void MappingTraits<COFF::relocation>::mapping(IO &IO, COFF::relocation &Rel) {
+void MappingTraits<COFFYAML::Relocation>::mapping(IO &IO,
+                                                  COFFYAML::Relocation &Rel) {
   MappingNormalization<NType, uint16_t> NT(IO, Rel.Type);
 
   IO.mapRequired("VirtualAddress", Rel.VirtualAddress);
-  IO.mapRequired("SymbolTableIndex", Rel.SymbolTableIndex);
+  IO.mapRequired("SymbolName", Rel.SymbolName);
   IO.mapRequired("Type", NT->Type);
 }
 
index f7631821c1923784411877b0211d4f05e2f23227..1badad8d5915b88c0ee215d5705c3b88dd81ff9b 100644 (file)
@@ -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
index 5134071cda4141c51b8104d8c6b21b10375bbcca..b775ae9cdfbdbcc0ae87bf7d33d2745c5207dd28 100644 (file)
@@ -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
index 6c87268801f383aeaa8dde4241f8993739d89611..49541336c682637dccfc177415d40e142101ab57 100644 (file)
@@ -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
index 909b269385bfacdb24ad290430d5a0a24f1680d9..0ec35bfc7e33fa730bbf6c25d67ce33661eadbbd 100644 (file)
@@ -66,13 +66,15 @@ void COFFDumper::dumpSections(unsigned NumSections) {
     Obj.getSectionContents(Sect, sectionData);
     Sec.SectionData = object::yaml::BinaryRef(sectionData);
 
-    std::vector<COFF::relocation> Relocations;
+    std::vector<COFFYAML::Relocation> 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);
     }
index d800b90791cffdbaaf2ff87f37fe9512dc892759..11aae0e68b6be7a3689a9666628a83ed1072b57d 100644 (file)
@@ -219,15 +219,25 @@ bool writeCOFF(COFFParser &CP, raw_ostream &OS) {
        << binary_le(i->Header.Characteristics);
   }
 
+  unsigned CurSymbol = 0;
+  StringMap<unsigned> SymbolTableIndexMap;
+  for (std::vector<COFFYAML::Symbol>::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<COFFYAML::Section>::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);
     }
   }