summaryrefslogtreecommitdiff
path: root/tools/yaml2obj/yaml2coff.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/yaml2obj/yaml2coff.cpp')
-rw-r--r--tools/yaml2obj/yaml2coff.cpp42
1 files changed, 21 insertions, 21 deletions
diff --git a/tools/yaml2obj/yaml2coff.cpp b/tools/yaml2obj/yaml2coff.cpp
index 61d985192552b..8f3f52179528d 100644
--- a/tools/yaml2obj/yaml2coff.cpp
+++ b/tools/yaml2obj/yaml2coff.cpp
@@ -14,12 +14,11 @@
#include "yaml2obj.h"
#include "llvm/ADT/STLExtras.h"
-#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringMap.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/Object/COFF.h"
-#include "llvm/Object/COFFYAML.h"
+#include "llvm/ObjectYAML/ObjectYAML.h"
#include "llvm/Support/Endian.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/SourceMgr.h"
@@ -76,14 +75,24 @@ struct COFFParser {
unsigned Index = getStringIndex(Name);
std::string str = utostr(Index);
if (str.size() > 7) {
- errs() << "String table got too large";
+ errs() << "String table got too large\n";
return false;
}
Sec.Header.Name[0] = '/';
std::copy(str.begin(), str.end(), Sec.Header.Name + 1);
}
- Sec.Header.Characteristics |= (Log2_32(Sec.Alignment) + 1) << 20;
+ if (Sec.Alignment) {
+ if (Sec.Alignment > 8192) {
+ errs() << "Section alignment is too large\n";
+ return false;
+ }
+ if (!isPowerOf2_32(Sec.Alignment)) {
+ errs() << "Section alignment is not a power of 2\n";
+ return false;
+ }
+ Sec.Header.Characteristics |= (Log2_32(Sec.Alignment) + 1) << 20;
+ }
}
return true;
}
@@ -173,12 +182,12 @@ static bool layoutCOFF(COFFParser &CP) {
// Assign each section data address consecutively.
for (COFFYAML::Section &S : CP.Obj.Sections) {
if (S.SectionData.binary_size() > 0) {
- CurrentSectionDataOffset = RoundUpToAlignment(
- CurrentSectionDataOffset, CP.isPE() ? CP.getFileAlignment() : 4);
+ CurrentSectionDataOffset = alignTo(CurrentSectionDataOffset,
+ CP.isPE() ? CP.getFileAlignment() : 4);
S.Header.SizeOfRawData = S.SectionData.binary_size();
if (CP.isPE())
S.Header.SizeOfRawData =
- RoundUpToAlignment(S.Header.SizeOfRawData, CP.getFileAlignment());
+ alignTo(S.Header.SizeOfRawData, CP.getFileAlignment());
S.Header.PointerToRawData = CurrentSectionDataOffset;
CurrentSectionDataOffset += S.Header.SizeOfRawData;
if (!S.Relocations.empty()) {
@@ -292,10 +301,9 @@ static uint32_t initializeOptionalHeader(COFFParser &CP, uint16_t Magic, T Heade
Header->FileAlignment = CP.Obj.OptionalHeader->Header.FileAlignment;
uint32_t SizeOfCode = 0, SizeOfInitializedData = 0,
SizeOfUninitializedData = 0;
- uint32_t SizeOfHeaders = RoundUpToAlignment(
- CP.SectionTableStart + CP.SectionTableSize, Header->FileAlignment);
- uint32_t SizeOfImage =
- RoundUpToAlignment(SizeOfHeaders, Header->SectionAlignment);
+ uint32_t SizeOfHeaders = alignTo(CP.SectionTableStart + CP.SectionTableSize,
+ Header->FileAlignment);
+ uint32_t SizeOfImage = alignTo(SizeOfHeaders, Header->SectionAlignment);
uint32_t BaseOfData = 0;
for (const COFFYAML::Section &S : CP.Obj.Sections) {
if (S.Header.Characteristics & COFF::IMAGE_SCN_CNT_CODE)
@@ -309,8 +317,7 @@ static uint32_t initializeOptionalHeader(COFFParser &CP, uint16_t Magic, T Heade
else if (S.Name.equals(".data"))
BaseOfData = S.Header.VirtualAddress; // RVA
if (S.Header.VirtualAddress)
- SizeOfImage +=
- RoundUpToAlignment(S.Header.VirtualSize, Header->SectionAlignment);
+ SizeOfImage += alignTo(S.Header.VirtualSize, Header->SectionAlignment);
}
Header->SizeOfCode = SizeOfCode;
Header->SizeOfInitializedData = SizeOfInitializedData;
@@ -525,14 +532,7 @@ static bool writeCOFF(COFFParser &CP, raw_ostream &OS) {
return true;
}
-int yaml2coff(yaml::Input &YIn, raw_ostream &Out) {
- COFFYAML::Object Doc;
- YIn >> Doc;
- if (YIn.error()) {
- errs() << "yaml2obj: Failed to parse YAML file!\n";
- return 1;
- }
-
+int yaml2coff(llvm::COFFYAML::Object &Doc, raw_ostream &Out) {
COFFParser CP(Doc);
if (!CP.parse()) {
errs() << "yaml2obj: Failed to parse YAML file!\n";