aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-libtool-darwin/llvm-libtool-darwin.cpp
diff options
context:
space:
mode:
authorSameer Arora <sameerarora101@fb.com>2020-07-20 16:10:07 -0700
committerSameer Arora <sameerarora101@fb.com>2020-08-07 14:44:32 -0700
commit71a1f135e4ede2b03f5efb7e18dca1c3db7504ec (patch)
treee3c10db38ffc6398f868695758ca8e58d81a3da5 /llvm/tools/llvm-libtool-darwin/llvm-libtool-darwin.cpp
parentd9a9192984fafb6a81616aafcdcf388fba7b8e14 (diff)
downloadllvm-71a1f135e4ede2b03f5efb7e18dca1c3db7504ec.zip
llvm-71a1f135e4ede2b03f5efb7e18dca1c3db7504ec.tar.gz
llvm-71a1f135e4ede2b03f5efb7e18dca1c3db7504ec.tar.bz2
[llvm-libtool-darwin] Add support for -D and -U options
Add support for `-D` and `-U` options for llvm-libtool-darwin. `-D` allows for using zero for timestamps and UIDs/GIDs. `-U` allows for using actual timestamps and UIDs/GIDs. Reviewed by jhenderson, smeenai Differential Revision: https://reviews.llvm.org/D84209
Diffstat (limited to 'llvm/tools/llvm-libtool-darwin/llvm-libtool-darwin.cpp')
-rw-r--r--llvm/tools/llvm-libtool-darwin/llvm-libtool-darwin.cpp76
1 files changed, 51 insertions, 25 deletions
diff --git a/llvm/tools/llvm-libtool-darwin/llvm-libtool-darwin.cpp b/llvm/tools/llvm-libtool-darwin/llvm-libtool-darwin.cpp
index d5eccaf..871a803 100644
--- a/llvm/tools/llvm-libtool-darwin/llvm-libtool-darwin.cpp
+++ b/llvm/tools/llvm-libtool-darwin/llvm-libtool-darwin.cpp
@@ -42,11 +42,23 @@ static cl::opt<Operation> LibraryOperation(
"Produce a statically linked library from the input files")),
cl::Required, cl::cat(LibtoolCategory));
+static cl::opt<bool> DeterministicOption(
+ "D", cl::desc("Use zero for timestamps and UIDs/GIDs (Default)"),
+ cl::init(false), cl::cat(LibtoolCategory));
+
+static cl::opt<bool>
+ NonDeterministicOption("U", cl::desc("Use actual timestamps and UIDs/GIDs"),
+ cl::init(false), cl::cat(LibtoolCategory));
+
static cl::opt<std::string>
FileList("filelist",
cl::desc("Pass in file containing a list of filenames"),
cl::value_desc("listfile[,dirname]"), cl::cat(LibtoolCategory));
+struct Config {
+ bool Deterministic = true; // Updated by 'D' and 'U' modifiers.
+};
+
static Error processFileList() {
StringRef FileName, DirName;
std::tie(FileName, DirName) = StringRef(FileList).rsplit(",");
@@ -99,9 +111,9 @@ static Error verifyMachOObject(const NewArchiveMember &Member) {
}
static Error addChildMember(std::vector<NewArchiveMember> &Members,
- const object::Archive::Child &M) {
+ const object::Archive::Child &M, const Config &C) {
Expected<NewArchiveMember> NMOrErr =
- NewArchiveMember::getOldMember(M, /*Deterministic=*/true);
+ NewArchiveMember::getOldMember(M, C.Deterministic);
if (!NMOrErr)
return NMOrErr.takeError();
@@ -115,9 +127,10 @@ static Error addChildMember(std::vector<NewArchiveMember> &Members,
static Error
addMember(std::vector<NewArchiveMember> &Members, StringRef FileName,
- std::vector<std::unique_ptr<MemoryBuffer>> &ArchiveBuffers) {
+ std::vector<std::unique_ptr<MemoryBuffer>> &ArchiveBuffers,
+ const Config &C) {
Expected<NewArchiveMember> NMOrErr =
- NewArchiveMember::getFile(FileName, /*Deterministic=*/true);
+ NewArchiveMember::getFile(FileName, C.Deterministic);
if (!NMOrErr)
return createFileError(FileName, NMOrErr.takeError());
@@ -135,7 +148,7 @@ addMember(std::vector<NewArchiveMember> &Members, StringRef FileName,
Error Err = Error::success();
for (const object::Archive::Child &Child : Lib.children(Err))
- if (Error E = addChildMember(Members, Child))
+ if (Error E = addChildMember(Members, Child, C))
return createFileError(FileName, std::move(E));
if (Err)
return createFileError(FileName, std::move(Err));
@@ -154,43 +167,56 @@ addMember(std::vector<NewArchiveMember> &Members, StringRef FileName,
return Error::success();
}
-static Error createStaticLibrary() {
+static Error createStaticLibrary(const Config &C) {
std::vector<NewArchiveMember> NewMembers;
std::vector<std::unique_ptr<MemoryBuffer>> ArchiveBuffers;
for (StringRef Member : InputFiles)
- if (Error E = addMember(NewMembers, Member, ArchiveBuffers))
+ if (Error E = addMember(NewMembers, Member, ArchiveBuffers, C))
return E;
- if (Error E = writeArchive(OutputFile, NewMembers,
- /*WriteSymtab=*/true,
- /*Kind=*/object::Archive::K_DARWIN,
- /*Deterministic=*/true,
- /*Thin=*/false))
+ if (Error E =
+ writeArchive(OutputFile, NewMembers,
+ /*WriteSymtab=*/true,
+ /*Kind=*/object::Archive::K_DARWIN, C.Deterministic,
+ /*Thin=*/false))
return E;
return Error::success();
}
+static Expected<Config> parseCommandLine(int Argc, char **Argv) {
+ Config C;
+ cl::ParseCommandLineOptions(Argc, Argv, "llvm-libtool-darwin\n");
+
+ if (DeterministicOption && NonDeterministicOption)
+ return createStringError(std::errc::invalid_argument,
+ "cannot specify both -D and -U flags");
+ else if (NonDeterministicOption)
+ C.Deterministic = false;
+
+ if (!FileList.empty())
+ if (Error E = processFileList())
+ return std::move(E);
+
+ if (InputFiles.empty())
+ return createStringError(std::errc::invalid_argument,
+ "no input files specified");
+
+ return C;
+}
+
int main(int Argc, char **Argv) {
InitLLVM X(Argc, Argv);
cl::HideUnrelatedOptions({&LibtoolCategory, &ColorCategory});
- cl::ParseCommandLineOptions(Argc, Argv, "llvm-libtool-darwin\n");
- if (!FileList.empty()) {
- if (Error E = processFileList()) {
- WithColor::defaultErrorHandler(std::move(E));
- return EXIT_FAILURE;
- }
- }
-
- if (InputFiles.empty()) {
- Error E = createStringError(std::errc::invalid_argument,
- "no input files specified");
- WithColor::defaultErrorHandler(std::move(E));
+ Expected<Config> ConfigOrErr = parseCommandLine(Argc, Argv);
+ if (!ConfigOrErr) {
+ WithColor::defaultErrorHandler(ConfigOrErr.takeError());
return EXIT_FAILURE;
}
+ Config C = *ConfigOrErr;
switch (LibraryOperation) {
case Operation::Static:
- if (Error E = createStaticLibrary()) {
+ if (Error E = createStaticLibrary(C)) {
WithColor::defaultErrorHandler(std::move(E));
return EXIT_FAILURE;
}