[llvm] r180115 - Write relocations in yaml2obj.
Rafael Espindola
rafael.espindola at gmail.com
Tue Apr 23 08:53:02 PDT 2013
Author: rafael
Date: Tue Apr 23 10:53:02 2013
New Revision: 180115
URL: http://llvm.org/viewvc/llvm-project?rev=180115&view=rev
Log:
Write relocations in yaml2obj.
Modified:
llvm/trunk/test/Object/yaml2obj-readobj.test
llvm/trunk/tools/yaml2obj/yaml2obj.cpp
Modified: llvm/trunk/test/Object/yaml2obj-readobj.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/yaml2obj-readobj.test?rev=180115&r1=180114&r2=180115&view=diff
==============================================================================
--- llvm/trunk/test/Object/yaml2obj-readobj.test (original)
+++ llvm/trunk/test/Object/yaml2obj-readobj.test Tue Apr 23 10:53:02 2013
@@ -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-NEXT: IMAGE_FILE_DEBUG_STRIPPED (0x200)
// 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: ]
Modified: llvm/trunk/tools/yaml2obj/yaml2obj.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2obj.cpp?rev=180115&r1=180114&r2=180115&view=diff
==============================================================================
--- llvm/trunk/tools/yaml2obj/yaml2obj.cpp (original)
+++ llvm/trunk/tools/yaml2obj/yaml2obj.cpp Tue Apr 23 10:53:02 2013
@@ -186,6 +186,7 @@ struct COFFParser {
errs() << "SectionData must be a collection of pairs of hex bytes";
return false;
}
+ Sec.Relocations = YamlSection.Relocations;
Sections.push_back(Sec);
}
return true;
@@ -289,6 +290,12 @@ static bool layoutCOFF(COFFParser &CP) {
i->Header.SizeOfRawData = i->Data.size();
i->Header.PointerToRawData = CurrentSectionDataOffset;
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.
} else {
i->Header.SizeOfRawData = 0;
@@ -374,6 +381,12 @@ void writeCOFF(COFFParser &CP, raw_ostre
i != e; ++i) {
if (!i->Data.empty())
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.
More information about the llvm-commits
mailing list