[llvm] r184621 - [yaml2obj][ELF] Align section contents in the output.
Sean Silva
silvas at purdue.edu
Fri Jun 21 17:47:43 PDT 2013
Author: silvas
Date: Fri Jun 21 19:47:43 2013
New Revision: 184621
URL: http://llvm.org/viewvc/llvm-project?rev=184621&view=rev
Log:
[yaml2obj][ELF] Align section contents in the output.
The improperly aligned section content in the output was causing
buildbot failures. This should fix them.
Incidentally, this results in a simpler and more robust API for
ContiguousBlobAccumulator.
Modified:
llvm/trunk/tools/yaml2obj/yaml2elf.cpp
Modified: llvm/trunk/tools/yaml2obj/yaml2elf.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2elf.cpp?rev=184621&r1=184620&r2=184621&view=diff
==============================================================================
--- llvm/trunk/tools/yaml2obj/yaml2elf.cpp (original)
+++ llvm/trunk/tools/yaml2obj/yaml2elf.cpp Fri Jun 21 19:47:43 2013
@@ -72,11 +72,23 @@ class ContiguousBlobAccumulator {
SmallVector<char, 128> Buf;
raw_svector_ostream OS;
+ /// \returns The new offset.
+ uint64_t padToAlignment(unsigned Align) {
+ uint64_t CurrentOffset = InitialOffset + OS.tell();
+ uint64_t AlignedOffset = RoundUpToAlignment(CurrentOffset, Align);
+ for (; CurrentOffset != AlignedOffset; ++CurrentOffset)
+ OS.write('\0');
+ return AlignedOffset; // == CurrentOffset;
+ }
+
public:
ContiguousBlobAccumulator(uint64_t InitialOffset_)
: InitialOffset(InitialOffset_), Buf(), OS(Buf) {}
- raw_ostream &getOS() { return OS; }
- uint64_t currentOffset() const { return InitialOffset + OS.tell(); }
+ template <class Integer>
+ raw_ostream &getOSAndAlignedOffset(Integer &Offset, unsigned Align = 16) {
+ Offset = padToAlignment(Align);
+ return OS;
+ }
void writeBlobToStream(raw_ostream &Out) { Out << OS.str(); }
};
} // end anonymous namespace
@@ -128,9 +140,8 @@ static void createStringTableSectionHead
StringTableBuilder &STB,
ContiguousBlobAccumulator &CBA) {
SHeader.sh_type = ELF::SHT_STRTAB;
- SHeader.sh_offset = CBA.currentOffset();
+ STB.writeToStream(CBA.getOSAndAlignedOffset(SHeader.sh_offset));
SHeader.sh_size = STB.size();
- STB.writeToStream(CBA.getOS());
SHeader.sh_addralign = 1;
}
@@ -224,9 +235,8 @@ static void handleSymtabSectionHeader(
addSymbols(Sec.Symbols.Weak, State, Syms, ELF::STB_WEAK);
ContiguousBlobAccumulator &CBA = State.getSectionContentAccum();
- SHeader.sh_offset = CBA.currentOffset();
+ writeVectorData(CBA.getOSAndAlignedOffset(SHeader.sh_offset), Syms);
SHeader.sh_size = vectorDataSize(Syms);
- writeVectorData(CBA.getOS(), Syms);
}
template <class ELFT>
@@ -309,9 +319,8 @@ static int writeELF(raw_ostream &OS, con
SHeader.sh_flags = Sec.Flags;
SHeader.sh_addr = Sec.Address;
- SHeader.sh_offset = CBA.currentOffset();
+ Sec.Content.writeAsBinary(CBA.getOSAndAlignedOffset(SHeader.sh_offset));
SHeader.sh_size = Sec.Content.binary_size();
- Sec.Content.writeAsBinary(CBA.getOS());
if (!Sec.Link.empty()) {
unsigned Index;
More information about the llvm-commits
mailing list