[llvm] 6bf20aa - [AIX] support xcoff for llvm-nm

via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 11 12:53:50 PST 2022


Author: zhijian
Date: 2022-01-11T15:53:25-05:00
New Revision: 6bf20aa59030175139853e48ccdfe31d718c1566

URL: https://github.com/llvm/llvm-project/commit/6bf20aa59030175139853e48ccdfe31d718c1566
DIFF: https://github.com/llvm/llvm-project/commit/6bf20aa59030175139853e48ccdfe31d718c1566.diff

LOG: [AIX] support xcoff for llvm-nm

Summary:

add the xcoff symbol type functionality for llvm-nm.

Reviewers: James Henderson
Differential Revision: https://reviews.llvm.org/D112450

Added: 
    llvm/test/tools/llvm-nm/XCOFF/basic.test
    llvm/test/tools/llvm-nm/XCOFF/basic_64.test
    llvm/test/tools/llvm-nm/XCOFF/invalid-section-index.test

Modified: 
    llvm/tools/llvm-nm/llvm-nm.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/test/tools/llvm-nm/XCOFF/basic.test b/llvm/test/tools/llvm-nm/XCOFF/basic.test
new file mode 100644
index 0000000000000..f1c1ff33b4758
--- /dev/null
+++ b/llvm/test/tools/llvm-nm/XCOFF/basic.test
@@ -0,0 +1,118 @@
+## Test llvm-nm for XCOFF object files.
+
+# RUN: yaml2obj %s -o %t.o
+# RUN: llvm-nm  %t.o | FileCheck --match-full-lines %s
+
+--- !XCOFF
+FileHeader:
+  MagicNumber:          0x1DF
+Sections:
+  - Name:                    .text
+    Address:                 0x0
+    Flags:                   [ STYP_TEXT ]
+  - Name:                    .data
+    Flags:                   [ STYP_DATA ]
+  - Name:                    .bss
+    Flags:                   [ STYP_BSS ]
+  - Name:                    .debug
+    Flags:                   [ STYP_DEBUG ]
+  - Name:                    .except
+    Flags:                   [ STYP_EXCEPT ]
+Symbols:
+  - Name: .file
+    Section: N_DEBUG
+    StorageClass: C_FILE
+  - Name:               .text
+    Value:              0x10
+    Section:            .text
+    StorageClass:       C_STAT
+    NumberOfAuxEntries: 1
+  - Name:               .data
+    Value:              0x80
+    Section:            .data
+    StorageClass:       C_STAT
+    NumberOfAuxEntries: 1
+  - Name:               .bss
+    Value:              0x310
+    Section:            .bss
+    StorageClass:       C_STAT
+  - Name:               .debug
+    Section:            .debug
+    StorageClass:       C_STAT
+  - Name:               ._ZL5func0v
+    Section:            .text
+    StorageClass:       C_EXT
+    Type:               0x20
+    AuxEntries:
+     - Type:                   AUX_CSECT
+       SymbolAlignmentAndType: 0x02
+       StorageMappingClass:    XMC_PR
+  - Name:               ._Z3fwpv
+    Section:            .text
+    StorageClass:       C_WEAKEXT
+    Type:               0x20
+    AuxEntries:
+     - Type:                   AUX_CSECT
+       SymbolAlignmentAndType: 0x02
+       StorageMappingClass:    XMC_PR
+  - Name:               val
+    Section:            .data
+    StorageClass:       C_EXT
+    Type:               0x20
+    AuxEntries:
+     - Type:                   AUX_CSECT
+       SymbolAlignmentAndType: 0x01
+       StorageMappingClass:    XMC_RW
+       SectionOrLength:        0x4
+  - Name:               extval
+    Section:            N_UNDEF
+    StorageClass:       C_EXT
+    Type:               0x00
+    AuxEntries:
+     - Type:                   AUX_CSECT
+       SymbolAlignmentAndType: 0x01
+       StorageMappingClass:    XMC_UA
+       SectionOrLength:        0x0
+  - Name:               comval
+    Section:            .bss
+    Value:              0x13C
+    StorageClass:       C_EXT
+    Type:               0x00
+    AuxEntries:
+     - Type:                   AUX_CSECT
+       SymbolAlignmentAndType: 0x03
+       StorageMappingClass:    XMC_RW
+       SectionOrLength:        0x0
+  - Name:      abs
+    Section:   N_ABS
+  - Name:      symIn_N_debug
+    Section:   N_DEBUG
+  - Name:      .except
+    Section:   .except
+
+## Global weak symbol.
+# CHECK:      00000000 W ._Z3fwpv
+## Global symbol in .text section.
+# CHECK-NEXT: 00000000 T ._ZL5func0v
+## Symbol in .bss section.
+# CHECK-NEXT: 00000310 b .bss
+## Local symbol in .data section.
+# CHECK-NEXT: 00000080 d .data
+## Symbol in .debug section.
+# CHECK-NEXT: 00000000 N .debug
+## Symbol in .except section.
+# CHECK-NEXT: 00000000 ? .except
+## Symbol .file.
+# CHECK-NEXT: 00000000 f .file
+## Local symbol in .text section.
+# CHECK-NEXT: 00000010 t .text
+## Absolute symbol.
+# CHECK-NEXT: 00000000 a abs
+## Common symbol.
+# CHECK-NEXT: 0000013c C comval
+## Undefined symbol.
+# CHECK-NEXT:          U extval
+## Symbol in N_DEBUG section.
+# CHECK-NEXT: 00000000 ? symIn_N_debug
+## Global symbol in .data section.
+# CHECK-NEXT: 00000000 D val

diff  --git a/llvm/test/tools/llvm-nm/XCOFF/basic_64.test b/llvm/test/tools/llvm-nm/XCOFF/basic_64.test
new file mode 100644
index 0000000000000..9d4fa8da9568d
--- /dev/null
+++ b/llvm/test/tools/llvm-nm/XCOFF/basic_64.test
@@ -0,0 +1,20 @@
+## Test showing 8 byte addresses for llvm-nm for XCOFF 64-bit object files.
+
+# RUN: yaml2obj %s -o %t.o
+# RUN: llvm-nm  %t.o | FileCheck --match-full-lines %s
+
+--- !XCOFF
+FileHeader:
+  MagicNumber:          0x1F7
+Sections:
+  - Name:                    .text
+    Address:                 0x0
+    Flags:                   [ STYP_TEXT ]
+Symbols:
+  - Name:               .text
+    Value:              0x10
+    Section:            .text
+    StorageClass:       C_STAT
+    NumberOfAuxEntries: 1
+
+# CHECK: 0000000000000010 t .text

diff  --git a/llvm/test/tools/llvm-nm/XCOFF/invalid-section-index.test b/llvm/test/tools/llvm-nm/XCOFF/invalid-section-index.test
new file mode 100644
index 0000000000000..6ca126042e56a
--- /dev/null
+++ b/llvm/test/tools/llvm-nm/XCOFF/invalid-section-index.test
@@ -0,0 +1,20 @@
+## Test the behavior of the symbol reference section.
+
+# RUN: yaml2obj  %s -o %t.o
+# RUN: llvm-nm %t.o 2>&1 | FileCheck %s -DFILE=%t.o
+
+# CHECK:      llvm-nm{{(\.exe)?}}: warning: [[FILE]]: for symbol with index 0: the section index (4) is invalid
+# CHECK-NEXT: 00000000 ? .text
+
+--- !XCOFF
+FileHeader:
+  MagicNumber: 0x1DF
+Sections:
+  - Name: .text
+Symbols:
+  - Name:               .text
+    Value:              0x0
+    SectionIndex:       4
+    Type:               0x0
+    StorageClass:       C_STAT
+    NumberOfAuxEntries: 1

diff  --git a/llvm/tools/llvm-nm/llvm-nm.cpp b/llvm/tools/llvm-nm/llvm-nm.cpp
index 0864985377cef..82ae31b17ca27 100644
--- a/llvm/tools/llvm-nm/llvm-nm.cpp
+++ b/llvm/tools/llvm-nm/llvm-nm.cpp
@@ -31,6 +31,7 @@
 #include "llvm/Object/TapiFile.h"
 #include "llvm/Object/TapiUniversal.h"
 #include "llvm/Object/Wasm.h"
+#include "llvm/Object/XCOFFObjectFile.h"
 #include "llvm/Option/Arg.h"
 #include "llvm/Option/ArgList.h"
 #include "llvm/Option/Option.h"
@@ -127,6 +128,20 @@ static bool HadError = false;
 
 static StringRef ToolName;
 
+static void warn(Error Err, Twine FileName, Twine Context = Twine()) {
+  assert(Err);
+
+  // Flush the standard output so that the warning isn't interleaved with other
+  // output if stdout and stderr are writing to the same place.
+  outs().flush();
+
+  handleAllErrors(std::move(Err), [&](const ErrorInfoBase &EI) {
+    WithColor::warning(errs(), ToolName)
+        << FileName << ": " << (Context.str().empty() ? "" : Context + ": ")
+        << EI.message() << "\n";
+  });
+}
+
 static void error(Twine Message, Twine Path = Twine()) {
   HadError = true;
   WithColor::error(errs(), ToolName) << Path << ": " << Message << "\n";
@@ -246,6 +261,9 @@ static char isSymbolList64Bit(SymbolicFile &Obj) {
     return Triple(IRObj->getTargetTriple()).isArch64Bit();
   if (isa<COFFObjectFile>(Obj) || isa<COFFImportFile>(Obj))
     return false;
+  if (XCOFFObjectFile *XCOFFObj = dyn_cast<XCOFFObjectFile>(&Obj))
+    return XCOFFObj->is64Bit();
+
   if (isa<WasmObjectFile>(Obj))
     return false;
   if (TapiFile *Tapi = dyn_cast<TapiFile>(&Obj))
@@ -897,6 +915,42 @@ static char getSymbolNMTypeChar(COFFObjectFile &Obj, symbol_iterator I) {
   return '?';
 }
 
+static char getSymbolNMTypeChar(XCOFFObjectFile &Obj, symbol_iterator I) {
+  Expected<uint32_t> TypeOrErr = I->getType();
+  if (!TypeOrErr) {
+    warn(TypeOrErr.takeError(), Obj.getFileName(),
+         "for symbol with index " +
+             Twine(Obj.getSymbolIndex(I->getRawDataRefImpl().p)));
+    return '?';
+  }
+
+  uint32_t SymType = *TypeOrErr;
+
+  if (SymType == SymbolRef::ST_File)
+    return 'f';
+
+  // If the I->getSection() call would return an error, the earlier I->getType()
+  // call will already have returned the same error first.
+  section_iterator SecIter = cantFail(I->getSection());
+
+  if (SecIter == Obj.section_end())
+    return '?';
+
+  if (Obj.isDebugSection(SecIter->getRawDataRefImpl()))
+    return 'N';
+
+  if (SecIter->isText())
+    return 't';
+
+  if (SecIter->isData())
+    return 'd';
+
+  if (SecIter->isBSS())
+    return 'b';
+
+  return '?';
+}
+
 static char getSymbolNMTypeChar(COFFImportFile &Obj) {
   switch (Obj.getCOFFImportHeader()->getType()) {
   case COFF::IMPORT_CODE:
@@ -1045,6 +1099,8 @@ static char getNMSectionTagAndName(SymbolicFile &Obj, basic_symbol_iterator I,
     Ret = getSymbolNMTypeChar(*IR, I);
   else if (COFFObjectFile *COFF = dyn_cast<COFFObjectFile>(&Obj))
     Ret = getSymbolNMTypeChar(*COFF, I);
+  else if (XCOFFObjectFile *XCOFF = dyn_cast<XCOFFObjectFile>(&Obj))
+    Ret = getSymbolNMTypeChar(*XCOFF, I);
   else if (COFFImportFile *COFFImport = dyn_cast<COFFImportFile>(&Obj))
     Ret = getSymbolNMTypeChar(*COFFImport);
   else if (MachOObjectFile *MachO = dyn_cast<MachOObjectFile>(&Obj))


        


More information about the llvm-commits mailing list