Skip to content

Commit

Permalink
[ObjectYAML] [COFF] Support multiple symbols with the same name
Browse files Browse the repository at this point in the history
Differential Revision: https://reviews.llvm.org/D56294

llvm-svn: 350566
  • Loading branch information
mstorsjo committed Jan 7, 2019
1 parent e25db17 commit 93a7137
Show file tree
Hide file tree
Showing 5 changed files with 109 additions and 3 deletions.
6 changes: 6 additions & 0 deletions llvm/include/llvm/ObjectYAML/COFFYAML.h
Expand Up @@ -58,7 +58,13 @@ LLVM_YAML_STRONG_TYPEDEF(uint8_t, AuxSymbolType)
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 {
Expand Down
3 changes: 2 additions & 1 deletion llvm/lib/ObjectYAML/COFFYAML.cpp
Expand Up @@ -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) {
Expand Down
74 changes: 74 additions & 0 deletions llvm/test/tools/yaml2obj/coff-symbol-index.yaml
@@ -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
...
18 changes: 17 additions & 1 deletion llvm/tools/obj2yaml/coff2yaml.cpp
Expand Up @@ -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"
Expand Down Expand Up @@ -142,6 +143,18 @@ void COFFDumper::dumpSections(unsigned NumSections) {
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;
Expand Down Expand Up @@ -192,7 +205,10 @@ void COFFDumper::dumpSections(unsigned NumSections) {
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);
Expand Down
11 changes: 10 additions & 1 deletion llvm/tools/yaml2obj/yaml2coff.cpp
Expand Up @@ -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>

Expand Down Expand Up @@ -520,7 +521,15 @@ static bool writeCOFF(COFFParser &CP, raw_ostream &OS) {
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);
Expand Down

0 comments on commit 93a7137

Please sign in to comment.