[llvm] r350566 - [ObjectYAML] [COFF] Support multiple symbols with the same name
Martin Storsjo via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 7 12:55:33 PST 2019
Author: mstorsjo
Date: Mon Jan 7 12:55:33 2019
New Revision: 350566
URL: http://llvm.org/viewvc/llvm-project?rev=350566&view=rev
Log:
[ObjectYAML] [COFF] Support multiple symbols with the same name
Differential Revision: https://reviews.llvm.org/D56294
Added:
llvm/trunk/test/tools/yaml2obj/coff-symbol-index.yaml
Modified:
llvm/trunk/include/llvm/ObjectYAML/COFFYAML.h
llvm/trunk/lib/ObjectYAML/COFFYAML.cpp
llvm/trunk/tools/obj2yaml/coff2yaml.cpp
llvm/trunk/tools/yaml2obj/yaml2coff.cpp
Modified: llvm/trunk/include/llvm/ObjectYAML/COFFYAML.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ObjectYAML/COFFYAML.h?rev=350566&r1=350565&r2=350566&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ObjectYAML/COFFYAML.h (original)
+++ llvm/trunk/include/llvm/ObjectYAML/COFFYAML.h Mon Jan 7 12:55:33 2019
@@ -58,7 +58,13 @@ LLVM_YAML_STRONG_TYPEDEF(uint8_t, AuxSym
struct Relocation {
uint32_t VirtualAddress;
uint16_t Type;
+
+ // Normally a Relocation can refer to the symbol via its name.
+ // It can also use a direct symbol table index instead (with no name
+ // specified), allowing disambiguating between multiple symbols with the
+ // same name or crafting intentionally broken files for testing.
StringRef SymbolName;
+ Optional<uint32_t> SymbolTableIndex;
};
struct Section {
Modified: llvm/trunk/lib/ObjectYAML/COFFYAML.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ObjectYAML/COFFYAML.cpp?rev=350566&r1=350565&r2=350566&view=diff
==============================================================================
--- llvm/trunk/lib/ObjectYAML/COFFYAML.cpp (original)
+++ llvm/trunk/lib/ObjectYAML/COFFYAML.cpp Mon Jan 7 12:55:33 2019
@@ -407,7 +407,8 @@ struct NDLLCharacteristics {
void MappingTraits<COFFYAML::Relocation>::mapping(IO &IO,
COFFYAML::Relocation &Rel) {
IO.mapRequired("VirtualAddress", Rel.VirtualAddress);
- IO.mapRequired("SymbolName", Rel.SymbolName);
+ IO.mapOptional("SymbolName", Rel.SymbolName, StringRef());
+ IO.mapOptional("SymbolTableIndex", Rel.SymbolTableIndex);
COFF::header &H = *static_cast<COFF::header *>(IO.getContext());
if (H.Machine == COFF::IMAGE_FILE_MACHINE_I386) {
Added: llvm/trunk/test/tools/yaml2obj/coff-symbol-index.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/yaml2obj/coff-symbol-index.yaml?rev=350566&view=auto
==============================================================================
--- llvm/trunk/test/tools/yaml2obj/coff-symbol-index.yaml (added)
+++ llvm/trunk/test/tools/yaml2obj/coff-symbol-index.yaml Mon Jan 7 12:55:33 2019
@@ -0,0 +1,74 @@
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-readobj -relocations %t | FileCheck %s --check-prefix=RELOCS
+# RUN: obj2yaml %t | FileCheck %s --check-prefix=YAML
+
+# RELOCS: Relocations [
+# RELOCS-NEXT: Section (1) .text {
+# RELOCS-NEXT: 0x3 IMAGE_REL_AMD64_REL32 .rdata (0)
+# RELOCS-NEXT: 0xA IMAGE_REL_AMD64_REL32 .rdata (1)
+# RELOCS-NEXT: 0x11 IMAGE_REL_AMD64_REL32 foo (2)
+# RELOCS-NEXT: }
+# RELOCS-NEXT: ]
+
+# Check that we usually output relocations with SymbolName.
+# For relocations with a non-unique symbol name, output
+# SymbolTableIndex instead.
+
+# YAML: Relocations:
+# YAML-NEXT: - VirtualAddress: 3
+# YAML-NEXT: SymbolTableIndex: 0
+# YAML-NEXT: Type: IMAGE_REL_AMD64_REL32
+# YAML-NEXT: - VirtualAddress: 10
+# YAML-NEXT: SymbolTableIndex: 1
+# YAML-NEXT: Type: IMAGE_REL_AMD64_REL32
+# YAML-NEXT: - VirtualAddress: 17
+# YAML-NEXT: SymbolName: foo
+# YAML-NEXT: Type: IMAGE_REL_AMD64_REL32
+
+--- !COFF
+header:
+ Machine: IMAGE_FILE_MACHINE_AMD64
+ Characteristics: [ ]
+sections:
+ - Name: .text
+ Characteristics: [ ]
+ Alignment: 4
+ SectionData: 488B0500000000488B0500000000488B0500000000
+ Relocations:
+ - VirtualAddress: 3
+ SymbolTableIndex: 0
+ Type: IMAGE_REL_AMD64_REL32
+ - VirtualAddress: 10
+ SymbolTableIndex: 1
+ Type: IMAGE_REL_AMD64_REL32
+ - VirtualAddress: 17
+ SymbolName: foo
+ Type: IMAGE_REL_AMD64_REL32
+ - Name: .rdata
+ Characteristics: [ ]
+ Alignment: 1
+ SectionData: '00'
+ - Name: .rdata
+ Characteristics: [ ]
+ Alignment: 1
+ SectionData: '01'
+symbols:
+ - Name: .rdata
+ Value: 0
+ SectionNumber: 2
+ SimpleType: IMAGE_SYM_TYPE_NULL
+ ComplexType: IMAGE_SYM_DTYPE_NULL
+ StorageClass: IMAGE_SYM_CLASS_STATIC
+ - Name: .rdata
+ Value: 0
+ SectionNumber: 3
+ SimpleType: IMAGE_SYM_TYPE_NULL
+ ComplexType: IMAGE_SYM_DTYPE_NULL
+ StorageClass: IMAGE_SYM_CLASS_STATIC
+ - Name: foo
+ Value: 0
+ SectionNumber: 3
+ SimpleType: IMAGE_SYM_TYPE_NULL
+ ComplexType: IMAGE_SYM_DTYPE_NULL
+ StorageClass: IMAGE_SYM_CLASS_EXTERNAL
+...
Modified: llvm/trunk/tools/obj2yaml/coff2yaml.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/obj2yaml/coff2yaml.cpp?rev=350566&r1=350565&r2=350566&view=diff
==============================================================================
--- llvm/trunk/tools/obj2yaml/coff2yaml.cpp (original)
+++ llvm/trunk/tools/obj2yaml/coff2yaml.cpp Mon Jan 7 12:55:33 2019
@@ -8,6 +8,7 @@
//===----------------------------------------------------------------------===//
#include "obj2yaml.h"
+#include "llvm/ADT/StringMap.h"
#include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h"
#include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h"
#include "llvm/DebugInfo/CodeView/StringsAndChecksums.h"
@@ -142,6 +143,18 @@ void COFFDumper::dumpSections(unsigned N
codeview::StringsAndChecksumsRef SC;
initializeFileAndStringTable(Obj, SC);
+ StringMap<bool> SymbolUnique;
+ for (const auto &S : Obj.symbols()) {
+ object::COFFSymbolRef Symbol = Obj.getCOFFSymbol(S);
+ StringRef Name;
+ Obj.getSymbolName(Symbol, Name);
+ StringMap<bool>::iterator It;
+ bool Inserted;
+ std::tie(It, Inserted) = SymbolUnique.insert(std::make_pair(Name, true));
+ if (!Inserted)
+ It->second = false;
+ }
+
for (const auto &ObjSection : Obj.sections()) {
const object::coff_section *COFFSection = Obj.getCOFFSection(ObjSection);
COFFYAML::Section NewYAMLSection;
@@ -192,7 +205,10 @@ void COFFDumper::dumpSections(unsigned N
OS.flush();
report_fatal_error(Buf);
}
- Rel.SymbolName = *SymbolNameOrErr;
+ if (SymbolUnique.lookup(*SymbolNameOrErr))
+ Rel.SymbolName = *SymbolNameOrErr;
+ else
+ Rel.SymbolTableIndex = reloc->SymbolTableIndex;
Rel.VirtualAddress = reloc->VirtualAddress;
Rel.Type = reloc->Type;
Relocations.push_back(Rel);
Modified: llvm/trunk/tools/yaml2obj/yaml2coff.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2coff.cpp?rev=350566&r1=350565&r2=350566&view=diff
==============================================================================
--- llvm/trunk/tools/yaml2obj/yaml2coff.cpp (original)
+++ llvm/trunk/tools/yaml2obj/yaml2coff.cpp Mon Jan 7 12:55:33 2019
@@ -24,6 +24,7 @@
#include "llvm/Support/Endian.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/SourceMgr.h"
+#include "llvm/Support/WithColor.h"
#include "llvm/Support/raw_ostream.h"
#include <vector>
@@ -520,7 +521,15 @@ static bool writeCOFF(COFFParser &CP, ra
assert(S.Header.SizeOfRawData >= S.SectionData.binary_size());
OS << num_zeros(S.Header.SizeOfRawData - S.SectionData.binary_size());
for (const COFFYAML::Relocation &R : S.Relocations) {
- uint32_t SymbolTableIndex = SymbolTableIndexMap[R.SymbolName];
+ uint32_t SymbolTableIndex;
+ if (R.SymbolTableIndex) {
+ if (!R.SymbolName.empty())
+ WithColor::error()
+ << "Both SymbolName and SymbolTableIndex specified\n";
+ SymbolTableIndex = *R.SymbolTableIndex;
+ } else {
+ SymbolTableIndex = SymbolTableIndexMap[R.SymbolName];
+ }
OS << binary_le(R.VirtualAddress)
<< binary_le(SymbolTableIndex)
<< binary_le(R.Type);
More information about the llvm-commits
mailing list