Write relocations in yaml2obj.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@180115 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola 2013-04-23 15:53:02 +00:00
parent 5bca705099
commit 120cf5743b
2 changed files with 34 additions and 1 deletions

View File

@ -1,5 +1,25 @@
RUN: yaml2obj %p/Inputs/COFF/i386.yaml | llvm-readobj -file-headers - | FileCheck %s --check-prefix COFF-I386 RUN: yaml2obj %p/Inputs/COFF/i386.yaml | llvm-readobj -file-headers -relocations -expand-relocs - | FileCheck %s --check-prefix COFF-I386
// COFF-I386: Characteristics [ (0x200) // COFF-I386: Characteristics [ (0x200)
// COFF-I386-NEXT: IMAGE_FILE_DEBUG_STRIPPED (0x200) // COFF-I386-NEXT: IMAGE_FILE_DEBUG_STRIPPED (0x200)
// COFF-I386-NEXT: ] // COFF-I386-NEXT: ]
// COFF-I386: Relocations [
// COFF-I386-NEXT: Section (1) .text {
// COFF-I386-NEXT: Relocation {
// COFF-I386-NEXT: Offset: 0xE
// COFF-I386-NEXT: Type: IMAGE_REL_I386_DIR32 (6)
// COFF-I386-NEXT: Symbol: L_.str
// COFF-I386-NEXT: }
// COFF-I386-NEXT: Relocation {
// COFF-I386-NEXT: Offset: 0x13
// COFF-I386-NEXT: Type: IMAGE_REL_I386_REL32 (20)
// COFF-I386-NEXT: Symbol: _puts
// COFF-I386-NEXT: }
// COFF-I386-NEXT: Relocation {
// COFF-I386-NEXT: Offset: 0x18
// COFF-I386-NEXT: Type: IMAGE_REL_I386_REL32 (20)
// COFF-I386-NEXT: Symbol: _SomeOtherFunction
// COFF-I386-NEXT: }
// COFF-I386-NEXT: }
// COFF-I386-NEXT: ]

View File

@ -186,6 +186,7 @@ struct COFFParser {
errs() << "SectionData must be a collection of pairs of hex bytes"; errs() << "SectionData must be a collection of pairs of hex bytes";
return false; return false;
} }
Sec.Relocations = YamlSection.Relocations;
Sections.push_back(Sec); Sections.push_back(Sec);
} }
return true; return true;
@ -289,6 +290,12 @@ static bool layoutCOFF(COFFParser &CP) {
i->Header.SizeOfRawData = i->Data.size(); i->Header.SizeOfRawData = i->Data.size();
i->Header.PointerToRawData = CurrentSectionDataOffset; i->Header.PointerToRawData = CurrentSectionDataOffset;
CurrentSectionDataOffset += i->Header.SizeOfRawData; CurrentSectionDataOffset += i->Header.SizeOfRawData;
if (!i->Relocations.empty()) {
i->Header.PointerToRelocations = CurrentSectionDataOffset;
i->Header.NumberOfRelocations = i->Relocations.size();
CurrentSectionDataOffset += i->Header.NumberOfRelocations *
COFF::RelocationSize;
}
// TODO: Handle alignment. // TODO: Handle alignment.
} else { } else {
i->Header.SizeOfRawData = 0; i->Header.SizeOfRawData = 0;
@ -374,6 +381,12 @@ void writeCOFF(COFFParser &CP, raw_ostream &OS) {
i != e; ++i) { i != e; ++i) {
if (!i->Data.empty()) if (!i->Data.empty())
OS.write(reinterpret_cast<const char*>(&i->Data[0]), i->Data.size()); OS.write(reinterpret_cast<const char*>(&i->Data[0]), i->Data.size());
for (unsigned I2 = 0, E2 = i->Relocations.size(); I2 != E2; ++I2) {
const COFF::relocation &R = i->Relocations[I2];
OS << binary_le(R.VirtualAddress)
<< binary_le(R.SymbolTableIndex)
<< binary_le(R.Type);
}
} }
// Output symbol table. // Output symbol table.