aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools')
-rw-r--r--llvm/tools/llvm-ar/llvm-ar.cpp86
-rw-r--r--llvm/tools/llvm-libtool-darwin/llvm-libtool-darwin.cpp11
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();