mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-27 02:26:05 +00:00

Tools like `install_name_tool` and `codesign` may modify the Mach-O header and increase its size. The linker has to provide padding to make this possible. This diff does that, plus sets its default value to 32 bytes (which is what ld64 does). Unlike ld64, however, we lay out our sections *exactly* `-headerpad` bytes from the header, whereas ld64 just treats the padding requirement as a lower bound. ld64 actually starts laying out the non-header sections in the __TEXT segment from the end of the (page-aligned) segment rather than the front, so its binaries typically have more than `-headerpad` bytes of actual padding. We should consider implementing the same alignment behavior. Reviewed By: #lld-macho, compnerd Differential Revision: https://reviews.llvm.org/D84714
93 lines
2.7 KiB
C++
93 lines
2.7 KiB
C++
//===- Args.cpp -----------------------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "lld/Common/Args.h"
|
|
#include "lld/Common/ErrorHandler.h"
|
|
#include "llvm/ADT/SmallVector.h"
|
|
#include "llvm/ADT/StringExtras.h"
|
|
#include "llvm/ADT/StringRef.h"
|
|
#include "llvm/Option/ArgList.h"
|
|
#include "llvm/Support/Path.h"
|
|
|
|
using namespace llvm;
|
|
using namespace lld;
|
|
|
|
// TODO(sbc): Remove this once CGOptLevel can be set completely based on bitcode
|
|
// function metadata.
|
|
CodeGenOpt::Level lld::args::getCGOptLevel(int optLevelLTO) {
|
|
if (optLevelLTO == 3)
|
|
return CodeGenOpt::Aggressive;
|
|
assert(optLevelLTO < 3);
|
|
return CodeGenOpt::Default;
|
|
}
|
|
|
|
static int64_t getInteger(opt::InputArgList &args, unsigned key,
|
|
int64_t Default, unsigned base) {
|
|
auto *a = args.getLastArg(key);
|
|
if (!a)
|
|
return Default;
|
|
|
|
int64_t v;
|
|
if (to_integer(a->getValue(), v, base))
|
|
return v;
|
|
|
|
StringRef spelling = args.getArgString(a->getIndex());
|
|
error(spelling + ": number expected, but got '" + a->getValue() + "'");
|
|
return 0;
|
|
}
|
|
|
|
int64_t lld::args::getInteger(opt::InputArgList &args, unsigned key,
|
|
int64_t Default) {
|
|
return ::getInteger(args, key, Default, 10);
|
|
}
|
|
|
|
int64_t lld::args::getHex(opt::InputArgList &args, unsigned key,
|
|
int64_t Default) {
|
|
return ::getInteger(args, key, Default, 16);
|
|
}
|
|
|
|
std::vector<StringRef> lld::args::getStrings(opt::InputArgList &args, int id) {
|
|
std::vector<StringRef> v;
|
|
for (auto *arg : args.filtered(id))
|
|
v.push_back(arg->getValue());
|
|
return v;
|
|
}
|
|
|
|
uint64_t lld::args::getZOptionValue(opt::InputArgList &args, int id,
|
|
StringRef key, uint64_t Default) {
|
|
for (auto *arg : args.filtered_reverse(id)) {
|
|
std::pair<StringRef, StringRef> kv = StringRef(arg->getValue()).split('=');
|
|
if (kv.first == key) {
|
|
uint64_t result = Default;
|
|
if (!to_integer(kv.second, result))
|
|
error("invalid " + key + ": " + kv.second);
|
|
return result;
|
|
}
|
|
}
|
|
return Default;
|
|
}
|
|
|
|
std::vector<StringRef> lld::args::getLines(MemoryBufferRef mb) {
|
|
SmallVector<StringRef, 0> arr;
|
|
mb.getBuffer().split(arr, '\n');
|
|
|
|
std::vector<StringRef> ret;
|
|
for (StringRef s : arr) {
|
|
s = s.trim();
|
|
if (!s.empty() && s[0] != '#')
|
|
ret.push_back(s);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
StringRef lld::args::getFilenameWithoutExe(StringRef path) {
|
|
if (path.endswith_lower(".exe"))
|
|
return sys::path::stem(path);
|
|
return sys::path::filename(path);
|
|
}
|