summaryrefslogtreecommitdiff
path: root/lib/MC
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2013-01-22 03:42:49 +0000
committerDaniel Dunbar <daniel@zuster.org>2013-01-22 03:42:49 +0000
commit849209686f778e5d6fce675bea9a8300aa596d25 (patch)
treeacffa43dcd7a7dfa75035d885885b6f8811aa6e8 /lib/MC
parent7511aab27ba0ee6afdc68c12488d7dbbbf53707c (diff)
downloadllvm-849209686f778e5d6fce675bea9a8300aa596d25.tar.gz
llvm-849209686f778e5d6fce675bea9a8300aa596d25.tar.bz2
llvm-849209686f778e5d6fce675bea9a8300aa596d25.tar.xz
[MC/Mach-O] Load commands are supposed to 8-byte aligned on 64-bit.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@173120 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC')
-rw-r--r--lib/MC/MachObjectWriter.cpp15
1 files changed, 8 insertions, 7 deletions
diff --git a/lib/MC/MachObjectWriter.cpp b/lib/MC/MachObjectWriter.cpp
index d13c178a9c..a5ba3c3653 100644
--- a/lib/MC/MachObjectWriter.cpp
+++ b/lib/MC/MachObjectWriter.cpp
@@ -377,25 +377,25 @@ void MachObjectWriter::WriteLinkeditLoadCommand(uint32_t Type,
}
static unsigned ComputeLinkerOptionsLoadCommandSize(
- const std::vector<std::string> &Options)
+ const std::vector<std::string> &Options, bool is64Bit)
{
unsigned Size = sizeof(macho::LinkerOptionsLoadCommand);
for (unsigned i = 0, e = Options.size(); i != e; ++i)
Size += Options[i].size() + 1;
- return RoundUpToAlignment(Size, 4);
+ return RoundUpToAlignment(Size, is64Bit ? 8 : 4);
}
void MachObjectWriter::WriteLinkerOptionsLoadCommand(
const std::vector<std::string> &Options)
{
- unsigned Size = ComputeLinkerOptionsLoadCommandSize(Options);
+ unsigned Size = ComputeLinkerOptionsLoadCommandSize(Options, is64Bit());
uint64_t Start = OS.tell();
(void) Start;
Write32(macho::LCT_LinkerOptions);
Write32(Size);
Write32(Options.size());
- uint64_t BytesWritten = 0;
+ uint64_t BytesWritten = sizeof(macho::LinkerOptionsLoadCommand);
for (unsigned i = 0, e = Options.size(); i != e; ++i) {
// Write each string, including the null byte.
const std::string &Option = Options[i];
@@ -403,8 +403,8 @@ void MachObjectWriter::WriteLinkerOptionsLoadCommand(
BytesWritten += Option.size() + 1;
}
- // Pad to a multiple of 4.
- WriteBytes("", OffsetToAlignment(BytesWritten, 4));
+ // Pad to a multiple of the pointer size.
+ WriteBytes("", OffsetToAlignment(BytesWritten, is64Bit() ? 8 : 4));
assert(OS.tell() - Start == Size);
}
@@ -747,7 +747,8 @@ void MachObjectWriter::WriteObject(MCAssembler &Asm,
Asm.getLinkerOptions();
for (unsigned i = 0, e = LinkerOptions.size(); i != e; ++i) {
++NumLoadCommands;
- LoadCommandsSize += ComputeLinkerOptionsLoadCommandSize(LinkerOptions[i]);
+ LoadCommandsSize += ComputeLinkerOptionsLoadCommandSize(LinkerOptions[i],
+ is64Bit());
}
// Compute the total size of the section data, as well as its file size and vm