diff options
Diffstat (limited to 'llvm/tools')
-rw-r--r-- | llvm/tools/llvm-ar/llvm-ar.cpp | 86 | ||||
-rw-r--r-- | llvm/tools/llvm-libtool-darwin/llvm-libtool-darwin.cpp | 11 |
2 files changed, 85 insertions, 12 deletions
diff --git a/llvm/tools/llvm-ar/llvm-ar.cpp b/llvm/tools/llvm-ar/llvm-ar.cpp index d21650d..9889ad9 100644 --- a/llvm/tools/llvm-ar/llvm-ar.cpp +++ b/llvm/tools/llvm-ar/llvm-ar.cpp @@ -69,7 +69,9 @@ static void printRanLibHelp(StringRef ToolName) { << " -v --version - Display the version of this program\n" << " -D - Use zero for timestamps and uids/gids " "(default)\n" - << " -U - Use actual timestamps and uids/gids\n"; + << " -U - Use actual timestamps and uids/gids\n" + << " -X{32|64|32_64|any} - Specify which archive symbol tables " + "should be generated if they do not already exist (AIX OS only)\n"; } static void printArHelp(StringRef ToolName) { @@ -225,7 +227,8 @@ static bool DisplayMemberOffsets = false; ///< 'O' modifier static bool CompareFullPath = false; ///< 'P' modifier static bool OnlyUpdate = false; ///< 'u' modifier static bool Verbose = false; ///< 'v' modifier -static bool Symtab = true; ///< 's' modifier +static SymtabWritingMode Symtab = + SymtabWritingMode::NormalSymtab; ///< 's' modifier static bool Deterministic = true; ///< 'D' and 'U' modifiers static bool Thin = false; ///< 'T' modifier static bool AddLibrary = false; ///< 'L' modifier @@ -371,11 +374,11 @@ static ArchiveOperation parseCommandLine() { CompareFullPath = true; break; case 's': - Symtab = true; + Symtab = SymtabWritingMode::NormalSymtab; MaybeJustCreateSymTab = true; break; case 'S': - Symtab = false; + Symtab = SymtabWritingMode::NoSymtab; break; case 'u': OnlyUpdate = true; @@ -1074,9 +1077,31 @@ static void createSymbolTable(object::Archive *OldArchive) { // In summary, we only need to update the symbol table if we have none. // This is actually very common because of broken build systems that think // they have to run ranlib. - if (OldArchive->hasSymbolTable()) - return; + if (OldArchive->hasSymbolTable()) { + if (OldArchive->kind() != object::Archive::K_AIXBIG) + return; + // For archives in the Big Archive format, the bit mode option specifies + // which symbol table to generate. The presence of a symbol table that does + // not match the specified bit mode does not prevent creation of the symbol + // table that has been requested. + if (OldArchive->kind() == object::Archive::K_AIXBIG) { + BigArchive *BigArc = dyn_cast<BigArchive>(OldArchive); + if (BigArc->has32BitGlobalSymtab() && + Symtab == SymtabWritingMode::BigArchive32) + return; + + if (BigArc->has64BitGlobalSymtab() && + Symtab == SymtabWritingMode::BigArchive64) + return; + + if (BigArc->has32BitGlobalSymtab() && BigArc->has64BitGlobalSymtab() && + Symtab == SymtabWritingMode::NormalSymtab) + return; + + Symtab = SymtabWritingMode::NormalSymtab; + } + } if (OldArchive->isThin()) Thin = true; performWriteOperation(CreateSymTab, OldArchive, nullptr, nullptr); @@ -1389,6 +1414,8 @@ static int ar_main(int argc, char **argv) { static int ranlib_main(int argc, char **argv) { std::vector<StringRef> Archives; + bool HasAIXXOption = false; + for (int i = 1; i < argc; ++i) { StringRef arg(argv[i]); if (handleGenericOption(arg)) { @@ -1406,6 +1433,28 @@ static int ranlib_main(int argc, char **argv) { } else if (arg.front() == 'v') { cl::PrintVersionMessage(); return 0; + } else if (arg.front() == 'X') { + if (object::Archive::getDefaultKindForHost() == + object::Archive::K_AIXBIG) { + HasAIXXOption = true; + arg.consume_front("X"); + const char *Xarg = arg.data(); + if (Xarg[0] == '\0') { + if (argv[i + 1][0] != '-') + BitMode = getBitMode(argv[++i]); + else + BitMode = BitModeTy::Unknown; + } else + BitMode = getBitMode(arg.data()); + + if (BitMode == BitModeTy::Unknown) + fail("the specified object mode is not valid. Specify -X32, " + "-X64, -X32_64, or -Xany"); + } else { + fail(Twine("-") + Twine(arg) + + " option not supported on non AIX OS"); + } + break; } else { // TODO: GNU ranlib also supports a -t flag fail("Invalid option: '-" + arg + "'"); @@ -1417,6 +1466,31 @@ static int ranlib_main(int argc, char **argv) { } } + if (object::Archive::getDefaultKindForHost() == object::Archive::K_AIXBIG) { + // If not specify -X option, get BitMode from enviorment variable + // "OBJECT_MODE" for AIX OS if specify. + if (!HasAIXXOption) { + if (char *EnvObjectMode = getenv("OBJECT_MODE")) { + BitMode = getBitMode(EnvObjectMode); + if (BitMode == BitModeTy::Unknown) + fail("the OBJECT_MODE environment variable has an invalid value. " + "OBJECT_MODE must be 32, 64, 32_64, or any"); + } + } + + switch (BitMode) { + case BitModeTy::Bit32: + Symtab = SymtabWritingMode::BigArchive32; + break; + case BitModeTy::Bit64: + Symtab = SymtabWritingMode::BigArchive64; + break; + default: + Symtab = SymtabWritingMode::NormalSymtab; + break; + } + } + for (StringRef Archive : Archives) { ArchiveName = Archive.str(); performOperation(CreateSymTab); diff --git a/llvm/tools/llvm-libtool-darwin/llvm-libtool-darwin.cpp b/llvm/tools/llvm-libtool-darwin/llvm-libtool-darwin.cpp index 5e0ba139..9680cfa 100644 --- a/llvm/tools/llvm-libtool-darwin/llvm-libtool-darwin.cpp +++ b/llvm/tools/llvm-libtool-darwin/llvm-libtool-darwin.cpp @@ -594,18 +594,17 @@ static Error createStaticLibrary(LLVMContext &LLVMCtx, const Config &C) { if (NewMembers.size() == 1) return writeArchive(OutputFile, NewMembers.begin()->second.getMembers(), - /*WriteSymtab=*/true, + SymtabWritingMode::NormalSymtab, /*Kind=*/object::Archive::K_DARWIN, C.Deterministic, /*Thin=*/false); SmallVector<OwningBinary<Archive>, 2> OutputBinaries; for (const std::pair<const uint64_t, NewArchiveMemberList> &M : NewMembers) { Expected<std::unique_ptr<MemoryBuffer>> OutputBufferOrErr = - writeArchiveToBuffer(M.second.getMembers(), - /*WriteSymtab=*/true, - /*Kind=*/object::Archive::K_DARWIN, - C.Deterministic, - /*Thin=*/false); + writeArchiveToBuffer( + M.second.getMembers(), SymtabWritingMode::NormalSymtab, + /*Kind=*/object::Archive::K_DARWIN, C.Deterministic, + /*Thin=*/false); if (!OutputBufferOrErr) return OutputBufferOrErr.takeError(); std::unique_ptr<MemoryBuffer> &OutputBuffer = OutputBufferOrErr.get(); |