[llvm] b135358 - [AIX] llvm-nm support environment "OBJECT_MODE" for option -X on AIX OS
via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 19 08:27:46 PDT 2022
Author: zhijian
Date: 2022-09-19T11:27:19-04:00
New Revision: b135358877e94dbd5d2f3231c2c98309fae70628
URL: https://github.com/llvm/llvm-project/commit/b135358877e94dbd5d2f3231c2c98309fae70628
DIFF: https://github.com/llvm/llvm-project/commit/b135358877e94dbd5d2f3231c2c98309fae70628.diff
LOG: [AIX] llvm-nm support environment "OBJECT_MODE" for option -X on AIX OS
Summary:
according nm in AIX OS , https://www.ibm.com/docs/en/aix/7.2?topic=n-nm-command
In AIX OS, The default is to process 32-bit object files (ignore 64-bit objects). The mode can also be set with the OBJECT_MODE environment variable. For example, OBJECT_MODE=64 causes nm to process any 64-bit objects and ignore 32-bit objects. The -X flag overrides the OBJECT_MODE variable.
In non AIX OS. The default is to process all support object files. and not support the OBJECT_MODE environment variable.
Reviewers: James Henderson
Differential Revision: https://reviews.llvm.org/D132494
Added:
llvm/test/tools/llvm-nm/option-X-AIX.test
llvm/test/tools/llvm-nm/option-X-Non-AIX.test
Modified:
llvm/docs/CommandGuide/llvm-nm.rst
llvm/test/tools/llvm-nm/option-X.test
llvm/tools/llvm-nm/llvm-nm.cpp
Removed:
################################################################################
diff --git a/llvm/docs/CommandGuide/llvm-nm.rst b/llvm/docs/CommandGuide/llvm-nm.rst
index d75cf2e80a3e..0b5dc867f3ae 100644
--- a/llvm/docs/CommandGuide/llvm-nm.rst
+++ b/llvm/docs/CommandGuide/llvm-nm.rst
@@ -141,6 +141,15 @@ OPTIONS
any
Process all the supported object files.
+ On AIX OS, the default is to process 32-bit object files only and to ignore
+ 64-bit objects. The can be changed by setting the OBJECT_MODE environment
+ variable. For example, OBJECT_MODE=64 causes :program:`llvm-nm` to process
+ 64-bit objects and ignore 32-bit objects. The -X flag overrides the OBJECT_MODE
+ variable.
+
+ On other operating systems, the default is to process all object files: the
+ OBJECT_MODE environment variable is not supported.
+
.. option:: --debug-syms, -a
Show all symbols, even those usually suppressed.
diff --git a/llvm/test/tools/llvm-nm/option-X-AIX.test b/llvm/test/tools/llvm-nm/option-X-AIX.test
new file mode 100644
index 000000000000..bc8a720af005
--- /dev/null
+++ b/llvm/test/tools/llvm-nm/option-X-AIX.test
@@ -0,0 +1,52 @@
+# REQUIRES: system-aix
+## Test default "-X" option and environment variable "OBJECT_MODE" on AIX OS.
+
+# RUN: yaml2obj -DFLAG=0x1DF %s -o %t_xcoff32.o
+# RUN: yaml2obj -DFLAG=0x1F7 %s -o %t_xcoff64.o
+# RUN: rm -rf %t.a
+# RUN: unset OBJECT_MODE
+# RUN: env OBJECT_MODE=any llvm-ar -q -c %t.a %t_xcoff32.o %t_xcoff64.o
+
+## Test default "-X" option.
+# RUN: llvm-nm --format=just-symbols %t_xcoff32.o %t_xcoff64.o | \
+# RUN: FileCheck -DFILE32=%t_xcoff32.o --check-prefixes=XCOFF32 %s --implicit-check-not={{.}}
+
+## Test environment variable "OBJECT_MODE".
+# RUN: env OBJECT_MODE=32 llvm-nm --format=just-symbols %t_xcoff32.o %t_xcoff64.o | \
+# RUN: FileCheck -DFILE32=%t_xcoff32.o --check-prefixes=XCOFF32 %s --implicit-check-not={{.}}
+# RUN: env OBJECT_MODE=64 llvm-nm --format=just-symbols %t_xcoff32.o %t_xcoff64.o | \
+# RUN: FileCheck -DFILE64=%t_xcoff64.o --check-prefixes=XCOFF64 %s --implicit-check-not={{.}}
+# RUN: env OBJECT_MODE=32_64 llvm-nm --format=just-symbols %t_xcoff32.o %t_xcoff64.o | \
+# RUN: FileCheck --check-prefixes=XCOFF32,XCOFF64 %s -DFILE32=%t_xcoff32.o -DFILE64=%t_xcoff64.o --match-full-lines
+# RUN: env OBJECT_MODE=any llvm-nm --format=just-symbols %t_xcoff32.o %t_xcoff64.o | \
+# RUN: FileCheck --check-prefixes=XCOFF32,XCOFF64 %s -DFILE32=%t_xcoff32.o -DFILE64=%t_xcoff64.o --match-full-lines
+# RUN: env OBJECT_MODE=32 llvm-nm --format=just-symbols %t.a | \
+# RUN: FileCheck -DFILE=%basename_t --check-prefixes=ARC32 %s --implicit-check-not={{.}}
+# RUN: env OBJECT_MODE=64 llvm-nm --format=just-symbols %t.a | \
+# RUN: FileCheck -DFILE=%basename_t --check-prefixes=ARC64 %s --implicit-check-not={{.}}
+
+## Test -X option overrides environment variable "OBJECT_MODE".
+# RUN: env OBJECT_MODE=any llvm-nm -X32 --format=just-symbols %t_xcoff32.o %t_xcoff64.o | \
+# RUN: FileCheck -DFILE32=%t_xcoff32.o --check-prefixes=XCOFF32 %s --implicit-check-not={{.}}
+# RUN: env OBJECT_MODE=any llvm-nm -X64 --format=just-symbols %t_xcoff32.o %t_xcoff64.o | \
+# RUN: FileCheck -DFILE64=%t_xcoff64.o --check-prefixes=XCOFF64 %s --implicit-check-not={{.}}
+# RUN: env OBJECT_MODE=any llvm-nm -X32_64 --format=just-symbols %t_xcoff32.o %t_xcoff64.o | \
+# RUN: FileCheck --check-prefixes=XCOFF32,XCOFF64 %s -DFILE32=%t_xcoff32.o -DFILE64=%t_xcoff64.o --match-full-lines
+# RUN: env OBJECT_MODE=32 llvm-nm -Xany --format=just-symbols %t_xcoff32.o %t_xcoff64.o | \
+# RUN: FileCheck --check-prefixes=XCOFF32,XCOFF64 %s -DFILE32=%t_xcoff32.o -DFILE64=%t_xcoff64.o --match-full-lines
+
+# XCOFF32: [[FILE32]]:
+# XCOFF32-NEXT: var_0x1DF
+# XCOFF64: [[FILE64]]:
+# XCOFF64-NEXT: var_0x1F7
+
+# ARC32: [[FILE]].tmp_xcoff32.o:
+# ARC32-NEXT: var_0x1DF
+# ARC64: [[FILE]].tmp_xcoff64.o:
+# ARC64-NEXT: var_0x1F7
+
+--- !XCOFF
+FileHeader:
+ MagicNumber: [[FLAG]]
+Symbols:
+ - Name: var_[[FLAG]]
diff --git a/llvm/test/tools/llvm-nm/option-X-Non-AIX.test b/llvm/test/tools/llvm-nm/option-X-Non-AIX.test
new file mode 100644
index 000000000000..188e19e823d0
--- /dev/null
+++ b/llvm/test/tools/llvm-nm/option-X-Non-AIX.test
@@ -0,0 +1,24 @@
+# REQUIRES: !system-aix
+
+# RUN: yaml2obj -DCLASS=ELFCLASS32 %s -o %t_elf32.o
+# RUN: yaml2obj -DCLASS=ELFCLASS64 %s -o %t_elf64.o
+
+--- !ELF
+FileHeader:
+ Class: [[CLASS]]
+ Data: ELFDATA2LSB
+ Type: ET_REL
+Symbols:
+ - Name: [[CLASS]]_var
+
+## Test that the environment variable "OBJECT_MODE" is ignored on non-AIX OS.
+# RUN: env OBJECT_MODE=32 llvm-nm --format=just-symbols %t_elf32.o %t_elf64.o | \
+# RUN: FileCheck %s -DFILE1=%t_elf32.o -DFILE2=%t_elf64.o --match-full-lines
+# RUN: env OBJECT_MODE=64 llvm-nm --format=just-symbols %t_elf32.o %t_elf64.o | \
+# RUN: FileCheck %s -DFILE1=%t_elf32.o -DFILE2=%t_elf64.o --match-full-lines
+
+# CHECK: [[FILE1]]:
+# CHECK-NEXT: ELFCLASS32_var
+# CHECK-EMPTY:
+# CHECK-NEXT: [[FILE2]]:
+# CHECK-NEXT: ELFCLASS64_var
diff --git a/llvm/test/tools/llvm-nm/option-X.test b/llvm/test/tools/llvm-nm/option-X.test
index caa21f9d7961..becc23ff7d8e 100644
--- a/llvm/test/tools/llvm-nm/option-X.test
+++ b/llvm/test/tools/llvm-nm/option-X.test
@@ -8,8 +8,6 @@
# RUN: FileCheck %s -DFILE1=%t32.bc --check-prefixes=BITCODE32 --implicit-check-not={{.}}
# RUN: llvm-nm --format=just-symbols -X64 %t32.bc %t64.bc | \
# RUN: FileCheck %s -DFILE2=%t64.bc --check-prefixes=BITCODE64 --implicit-check-not={{.}}
-# RUN: llvm-nm --format=just-symbols %t32.bc %t64.bc | \
-# RUN: FileCheck %s -DFILE1=%t32.bc -DFILE2=%t64.bc --check-prefixes=BITCODE32,BITCODE64
# RUN: llvm-nm --format=just-symbols -X32_64 %t32.bc %t64.bc | \
# RUN: FileCheck %s -DFILE1=%t32.bc -DFILE2=%t64.bc --check-prefixes=BITCODE32,BITCODE64
# RUN: llvm-nm --format=just-symbols -Xany %t32.bc %t64.bc | \
@@ -32,8 +30,6 @@
# RUN: FileCheck %s -DFILE32=%t_elf32.o --check-prefixes=ELF32 --implicit-check-not={{.}}
# RUN: llvm-nm --format=just-symbols -X64 %t_elf32.o %t_elf64.o | \
# RUN: FileCheck %s -DFILE64=%t_elf64.o --check-prefixes=ELF64 --implicit-check-not={{.}}
-# RUN: llvm-nm --format=just-symbols %t_elf32.o %t_elf64.o | \
-# RUN: FileCheck %s -DFILE32=%t_elf32.o -DFILE64=%t_elf64.o --check-prefixes=ELF32,ELF64
# RUN: llvm-nm --format=just-symbols -X32_64 %t_elf32.o %t_elf64.o | \
# RUN: FileCheck %s -DFILE32=%t_elf32.o -DFILE64=%t_elf64.o --check-prefixes=ELF32,ELF64
# RUN: llvm-nm --format=just-symbols -Xany %t_elf32.o %t_elf64.o | \
@@ -85,8 +81,6 @@ Symbols:
# BOTH-NEXT: [[FILE64]]:
# BOTH-NEXT: var_0x1F7
-# RUN: llvm-nm --format=just-symbols %t.a | \
-# RUN: FileCheck --check-prefixes=ARCHIVE-BOTH -DFILE=%basename_t --match-full-lines %s
# RUN: llvm-nm --format=just-symbols -X32_64 %t.a | \
# RUN: FileCheck --check-prefixes=ARCHIVE-BOTH -DFILE=%basename_t --match-full-lines %s
# RUN: llvm-nm --format=just-symbols -Xany %t.a | \
diff --git a/llvm/tools/llvm-nm/llvm-nm.cpp b/llvm/tools/llvm-nm/llvm-nm.cpp
index e8dbbd4e87bc..155efd9bf2de 100644
--- a/llvm/tools/llvm-nm/llvm-nm.cpp
+++ b/llvm/tools/llvm-nm/llvm-nm.cpp
@@ -16,6 +16,7 @@
//===----------------------------------------------------------------------===//
#include "llvm/ADT/StringSwitch.h"
+#include "llvm/ADT/Triple.h"
#include "llvm/BinaryFormat/COFF.h"
#include "llvm/BinaryFormat/XCOFF.h"
#include "llvm/Demangle/Demangle.h"
@@ -39,6 +40,7 @@
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/Format.h"
+#include "llvm/Support/Host.h"
#include "llvm/Support/InitLLVM.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/Program.h"
@@ -2371,17 +2373,32 @@ int main(int argc, char **argv) {
UndefinedOnly = Args.hasArg(OPT_undefined_only);
WithoutAliases = Args.hasArg(OPT_without_aliases);
- StringRef Mode = Args.getLastArgValue(OPT_X, "any");
- if (Mode == "32")
- BitMode = BitModeTy::Bit32;
- else if (Mode == "64")
- BitMode = BitModeTy::Bit64;
- else if (Mode == "32_64")
- BitMode = BitModeTy::Bit32_64;
- else if (Mode == "any")
+ // Get BitMode from enviornment variable "OBJECT_MODE" for AIX OS, if
+ // specified.
+ Triple HostTriple(sys::getProcessTriple());
+ if (HostTriple.isOSAIX()) {
+ BitMode = StringSwitch<BitModeTy>(getenv("OBJECT_MODE"))
+ .Case("32", BitModeTy::Bit32)
+ .Case("64", BitModeTy::Bit64)
+ .Case("32_64", BitModeTy::Bit32_64)
+ .Case("any", BitModeTy::Any)
+ .Default(BitModeTy::Bit32);
+ } else
BitMode = BitModeTy::Any;
- else
- error("-X value should be one of: 32, 64, 32_64, (default) any");
+
+ if (Arg *A = Args.getLastArg(OPT_X)) {
+ StringRef Mode = A->getValue();
+ if (Mode == "32")
+ BitMode = BitModeTy::Bit32;
+ else if (Mode == "64")
+ BitMode = BitModeTy::Bit64;
+ else if (Mode == "32_64")
+ BitMode = BitModeTy::Bit32_64;
+ else if (Mode == "any")
+ BitMode = BitModeTy::Any;
+ else
+ error("-X value should be one of: 32, 64, 32_64, (default) any");
+ }
// Mach-O specific options.
FormatMachOasHex = Args.hasArg(OPT_x);
More information about the llvm-commits
mailing list