diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2013-04-23 15:53:02 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2013-04-23 15:53:02 +0000 |
commit | 120cf5743b03d67d9f26ae05c2b79d98cc05f79d (patch) | |
tree | 1495a8ba6fd79ad5ebe52dc1feeb04240015d6d1 /tools | |
parent | 5bca7050991ee2993241aad73a2cddaa9c469e0d (diff) | |
download | external_llvm-120cf5743b03d67d9f26ae05c2b79d98cc05f79d.zip external_llvm-120cf5743b03d67d9f26ae05c2b79d98cc05f79d.tar.gz external_llvm-120cf5743b03d67d9f26ae05c2b79d98cc05f79d.tar.bz2 |
Write relocations in yaml2obj.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@180115 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools')
-rw-r--r-- | tools/yaml2obj/yaml2obj.cpp | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/tools/yaml2obj/yaml2obj.cpp b/tools/yaml2obj/yaml2obj.cpp index 5741d95..7f8663b 100644 --- a/tools/yaml2obj/yaml2obj.cpp +++ b/tools/yaml2obj/yaml2obj.cpp @@ -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_ostream &OS) { 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. |