llvm-readobj: Add test for COFF auxiliary symbols as used by C++/CLI
authorNico Rieck <nico.rieck@gmail.com>
Mon, 17 Mar 2014 01:46:28 +0000 (01:46 +0000)
committerNico Rieck <nico.rieck@gmail.com>
Mon, 17 Mar 2014 01:46:28 +0000 (01:46 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@204023 91177308-0d34-0410-b5e6-96231b3b80d8

test/tools/llvm-readobj/Inputs/cxx-cli-aux.cpp [new file with mode: 0644]
test/tools/llvm-readobj/Inputs/cxx-cli-aux.obj.coff-i386 [new file with mode: 0644]
test/tools/llvm-readobj/cxx-cli-aux.test [new file with mode: 0644]
tools/llvm-readobj/COFFDumper.cpp

diff --git a/test/tools/llvm-readobj/Inputs/cxx-cli-aux.cpp b/test/tools/llvm-readobj/Inputs/cxx-cli-aux.cpp
new file mode 100644 (file)
index 0000000..6386cb2
--- /dev/null
@@ -0,0 +1,2 @@
+// cl.exe -clr -c t.cpp -Fo"cxx-cli-aux.obj.coff-i386"
+__declspec(appdomain) int PerAppDomain = 0;
diff --git a/test/tools/llvm-readobj/Inputs/cxx-cli-aux.obj.coff-i386 b/test/tools/llvm-readobj/Inputs/cxx-cli-aux.obj.coff-i386
new file mode 100644 (file)
index 0000000..a88c670
Binary files /dev/null and b/test/tools/llvm-readobj/Inputs/cxx-cli-aux.obj.coff-i386 differ
diff --git a/test/tools/llvm-readobj/cxx-cli-aux.test b/test/tools/llvm-readobj/cxx-cli-aux.test
new file mode 100644 (file)
index 0000000..eac3041
--- /dev/null
@@ -0,0 +1,42 @@
+Ensure that we can read the COFF auxiliary symbols 'section definition' and
+'CLR token definition' as used in C++/CLI object files. Auxiliary section
+definitions usually only follow a symbol with static storage class, but
+non-const appdomain globals (external ABS) also get one.
+
+RUN: llvm-readobj -t %p/Inputs/cxx-cli-aux.obj.coff-i386 | FileCheck %s
+
+CHECK:      Symbols [
+CHECK:        Symbol {
+CHECK:          Name: ?PerAppDomain@@$$Q3HA
+CHECK-NEXT:     Value: 4
+CHECK-NEXT:     Section:  (65535)
+CHECK-NEXT:     BaseType: Null (0x0)
+CHECK-NEXT:     ComplexType: Null (0x0)
+CHECK-NEXT:     StorageClass: External (0x2)
+CHECK-NEXT:     AuxSymbolCount: 1
+CHECK-NEXT:     AuxSectionDef {
+CHECK-NEXT:       Length: 0
+CHECK-NEXT:       RelocationCount: 0
+CHECK-NEXT:       LineNumberCount: 0
+CHECK-NEXT:       Checksum: 0x0
+CHECK-NEXT:       Number: 0
+CHECK-NEXT:       Selection: NoDuplicates (0x1)
+CHECK-NEXT:       Unused: (00 00 00)
+CHECK-NEXT:     }
+CHECK-NEXT:   }
+
+CHECK:        Symbol {
+CHECK:          Name: 04000001
+CHECK-NEXT:     Value: 4
+CHECK-NEXT:     Section:  (65535)
+CHECK-NEXT:     BaseType: Null (0x0)
+CHECK-NEXT:     ComplexType: Null (0x0)
+CHECK-NEXT:     StorageClass: CLRToken (0x6B)
+CHECK-NEXT:     AuxSymbolCount: 1
+CHECK-NEXT:     AuxCLRToken {
+CHECK-NEXT:       AuxType: 1
+CHECK-NEXT:       Reserved: 0
+CHECK-NEXT:       SymbolTableIndex: 19
+CHECK-NEXT:       Unused: (00 00 00 00 00 00 00 00 00 00 00 00)
+CHECK-NEXT:     }
+CHECK-NEXT:   }
index dfe89d69ec5dc45075fc3dd5fc2fc03a13a1031b..28ac3cb4164d158f4064e5d4f5e09700cd1867fe 100644 (file)
@@ -1022,9 +1022,11 @@ void COFFDumper::printSymbol(symbol_iterator SymI) {
       DictScope AS(W, "AuxFileRecord");
       W.printString("FileName", StringRef(Aux->FileName));
 
+    // C++/CLI creates external ABS symbols for non-const appdomain globals.
+    // These are also followed by an auxiliary section definition.
     } else if (Symbol->StorageClass == COFF::IMAGE_SYM_CLASS_STATIC ||
                (Symbol->StorageClass == COFF::IMAGE_SYM_CLASS_EXTERNAL &&
-                Symbol->SectionNumber != COFF::IMAGE_SYM_UNDEFINED)) {
+                Symbol->SectionNumber == COFF::IMAGE_SYM_ABSOLUTE)) {
       const coff_aux_section_definition *Aux;
       if (error(getSymbolAuxData(Obj, Symbol + I, Aux)))
         break;