[XCOFF] Don't emit non-external labels in the symbol table and handle MCSA_LGlobal
authorDavid Tenty <daltenty@ibm.com>
Thu, 27 Feb 2020 15:43:27 +0000 (10:43 -0500)
committerDavid Tenty <daltenty@ibm.com>
Thu, 27 Feb 2020 18:37:13 +0000 (13:37 -0500)
Summary:
We need to handle the  MCSA_LGlobal case in emitSymbolAttribute for functions marked internal in the IR so that the
appropriate storage class is emitted on the function descriptor csect.  As part of this we need to make sure that external
labels are not emitted into the symbol table, so we don't emit the descriptor label in the object writing path.

Reviewers: jasonliu, DiggerLin, hubert.reinterpretcast

Reviewed By: jasonliu

Subscribers: Xiangling_L, wuzish, nemanjai, hiraditya, jsji, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D74968

llvm/lib/MC/MCXCOFFStreamer.cpp
llvm/lib/MC/XCOFFObjectWriter.cpp
llvm/test/CodeGen/PowerPC/aix-internal.ll [new file with mode: 0644]
llvm/test/CodeGen/PowerPC/aix-xcoff-mergeable-const.ll
llvm/test/CodeGen/PowerPC/aix-xcoff-mergeable-str.ll

index 2e66730..8c08e67 100644 (file)
 //
 //===----------------------------------------------------------------------===//
 
+#include "llvm/MC/MCXCOFFStreamer.h"
 #include "llvm/BinaryFormat/XCOFF.h"
 #include "llvm/MC/MCAsmBackend.h"
 #include "llvm/MC/MCCodeEmitter.h"
+#include "llvm/MC/MCDirectives.h"
 #include "llvm/MC/MCObjectWriter.h"
 #include "llvm/MC/MCSymbolXCOFF.h"
-#include "llvm/MC/MCXCOFFStreamer.h"
 #include "llvm/Support/TargetRegistry.h"
 
 using namespace llvm;
@@ -37,6 +38,10 @@ bool MCXCOFFStreamer::emitSymbolAttribute(MCSymbol *Sym,
     Symbol->setStorageClass(XCOFF::C_EXT);
     Symbol->setExternal(true);
     break;
+  case MCSA_LGlobal:
+    Symbol->setStorageClass(XCOFF::C_HIDEXT);
+    Symbol->setExternal(true);
+    break;
   default:
     report_fatal_error("Not implemented yet.");
   }
index 17ec6dd..bd9229d 100644 (file)
@@ -353,6 +353,10 @@ void XCOFFObjectWriter::executePostLayoutBinding(MCAssembler &Asm,
       if (XSym == ContainingCsect->getQualNameSymbol())
         continue;
 
+      // Only put a label into the symbol table when it is an external label.
+      if (!XSym->isExternal())
+        continue;
+
       assert(SectionMap.find(ContainingCsect) != SectionMap.end() &&
              "Expected containing csect to exist in map");
       // Lookup the containing csect and add the symbol to it.
diff --git a/llvm/test/CodeGen/PowerPC/aix-internal.ll b/llvm/test/CodeGen/PowerPC/aix-internal.ll
new file mode 100644 (file)
index 0000000..1a1fb78
--- /dev/null
@@ -0,0 +1,38 @@
+; RUN: llc -mtriple powerpc-ibm-aix -verify-machineinstrs -mcpu=pwr4  \
+; RUN: -filetype=obj -o %t.o < %s
+; RUN: llvm-readobj --syms %t.o | FileCheck %s
+; RUN: not --crash llc -mtriple powerpc64-ibm-aix -verify-machineinstrs -mcpu=pwr4 \
+; RUN: -filetype=obj -o %t.o < %s 2>&1 | FileCheck --check-prefix=64-CHECK %s
+
+define internal i32 @foo() {
+  ret i32 1
+}
+
+; CHECK:  Symbol {
+; CHECK:       Name: .foo
+; CHECK-NEXT:  Value (RelocatableAddress):
+; CHECK-NEXT:  Section: .text
+; CHECK-NEXT:  Type: 0x0
+; CHECK-NEXT:  StorageClass: C_HIDEXT (0x6B)
+
+; CHECK:  Symbol {
+; CHECK-NEXT: Index: [[#INDX:]]
+; CHECK-NEXT: Name: foo
+; CHECK-NEXT: Value (RelocatableAddress):
+; CHECK-NEXT: Section: .data
+; CHECK-NEXT: Type: 0x0
+; CHECK-NEXT: StorageClass: C_HIDEXT (0x6B)
+; CHECK-NEXT: NumberOfAuxEntries: 1
+; CHECK-NEXT: CSECT Auxiliary Entry {
+; CHECK-NEXT:  Index: [[#INDX+1]]
+; CHECK-NEXT:  SectionLen: 12
+; CHECK-NEXT:  ParameterHashIndex:
+; CHECK-NEXT:  TypeChkSectNum:
+; CHECK-NEXT:  SymbolAlignmentLog2:
+; CHECK-NEXT:  SymbolType: XTY_SD (0x1)
+; CHECK-NEXT:  StorageMappingClass: XMC_DS (0xA)
+
+; Make sure no label is emitted.
+; CHECK-NOT: Name: foo
+
+;64-CHECK: LLVM ERROR: 64-bit XCOFF object files are not supported yet.
index 09b1a4a..b9efa55 100644 (file)
@@ -52,18 +52,15 @@ entry:
 ;CHECKOBJ-NEXT:        4: 4e 80 00 20                    blr
 ;CHECKOBJ-NEXT:          ...{{[[:space:]] *}}
 ;CHECKOBJ-NEXT: 00000010 .rodata:
-;CHECKOBJ-NEXT:        10: 40 00 00 00                    bdnzf   0, .+0
-;CHECKOBJ-NEXT:        14: 00 00 00 32                    <unknown>
+;CHECKOBJ-NEXT:        10: 40 00 00 00
+;CHECKOBJ-NEXT:        14: 00 00 00 32
 ;CHECKOBJ-NEXT:          ...{{[[:space:]] *}}
-;CHECKOBJ-NEXT: 00000030 .L__const.main.cnst16:
-;CHECKOBJ-NEXT:       30: 40 00 00 00                    bdnzf   0, .+0
-;CHECKOBJ-NEXT:       34: 00 00 00 16                    <unknown>
+;CHECKOBJ-SAME:       30: 40 00 00 00
+;CHECKOBJ-NEXT:       34: 00 00 00 16
 ;CHECKOBJ-NEXT:          ...{{[[:space:]] *}}
-;CHECKOBJ-NEXT: 00000040 .L__const.main.cnst8:
-;CHECKOBJ-NEXT:       40: 40 00 00 08                    bdnzf   0, .+8
-;CHECKOBJ-NEXT:       44: 00 00 00 00                    <unknown>{{[[:space:]] *}}
-;CHECKOBJ-NEXT: 00000048 .L__const.main.cnst4:
-;CHECKOBJ-NEXT:       48: 40 08 00 00                    bdnzf   8, .+0
+;CHECKOBJ-SAME:       40: 40 00 00 08
+;CHECKOBJ-NEXT:       44: 00 00 00 00
+;CHECKOBJ-NEXT:       48: 40 08 00 00
 
 
 ;CHECKSYM:        Symbol {{[{][[:space:]] *}}Index: [[#Index:]]{{[[:space:]] *}}Name: .rodata
@@ -84,83 +81,3 @@ entry:
 ;CHECKSYM-NEXT:       StabSectNum: 0x0
 ;CHECKSYM-NEXT:     }
 ;CHECKSYM-NEXT:   }
-;CHECKSYM-NEXT:   Symbol {
-;CHECKSYM-NEXT:     Index: [[#Index+2]]
-;CHECKSYM-NEXT:     Name: .L__const.main.cnst32
-;CHECKSYM-NEXT:     Value (RelocatableAddress): 0x10
-;CHECKSYM-NEXT:     Section: .text
-;CHECKSYM-NEXT:     Type: 0x0
-;CHECKSYM-NEXT:     StorageClass: C_HIDEXT (0x6B)
-;CHECKSYM-NEXT:     NumberOfAuxEntries: 1
-;CHECKSYM-NEXT:     CSECT Auxiliary Entry {
-;CHECKSYM-NEXT:       Index: [[#Index+3]]
-;CHECKSYM-NEXT:       ContainingCsectSymbolIndex: [[#Index]]
-;CHECKSYM-NEXT:       ParameterHashIndex: 0x0
-;CHECKSYM-NEXT:       TypeChkSectNum: 0x0
-;CHECKSYM-NEXT:       SymbolAlignmentLog2: 0
-;CHECKSYM-NEXT:       SymbolType: XTY_LD (0x2)
-;CHECKSYM-NEXT:       StorageMappingClass: XMC_RO (0x1)
-;CHECKSYM-NEXT:       StabInfoIndex: 0x0
-;CHECKSYM-NEXT:       StabSectNum: 0x0
-;CHECKSYM-NEXT:     }
-;CHECKSYM-NEXT:   }
-;CHECKSYM-NEXT:   Symbol {
-;CHECKSYM-NEXT:     Index: [[#Index+4]]
-;CHECKSYM-NEXT:     Name: .L__const.main.cnst16
-;CHECKSYM-NEXT:     Value (RelocatableAddress): 0x30
-;CHECKSYM-NEXT:     Section: .text
-;CHECKSYM-NEXT:     Type: 0x0
-;CHECKSYM-NEXT:     StorageClass: C_HIDEXT (0x6B)
-;CHECKSYM-NEXT:     NumberOfAuxEntries: 1
-;CHECKSYM-NEXT:     CSECT Auxiliary Entry {
-;CHECKSYM-NEXT:       Index: [[#Index+5]]
-;CHECKSYM-NEXT:       ContainingCsectSymbolIndex: [[#Index]]
-;CHECKSYM-NEXT:       ParameterHashIndex: 0x0
-;CHECKSYM-NEXT:       TypeChkSectNum: 0x0
-;CHECKSYM-NEXT:       SymbolAlignmentLog2: 0
-;CHECKSYM-NEXT:       SymbolType: XTY_LD (0x2)
-;CHECKSYM-NEXT:       StorageMappingClass: XMC_RO (0x1)
-;CHECKSYM-NEXT:       StabInfoIndex: 0x0
-;CHECKSYM-NEXT:       StabSectNum: 0x0
-;CHECKSYM-NEXT:     }
-;CHECKSYM-NEXT:   }
-;CHECKSYM-NEXT:   Symbol {
-;CHECKSYM-NEXT:     Index: [[#Index+6]]
-;CHECKSYM-NEXT:     Name: .L__const.main.cnst8
-;CHECKSYM-NEXT:     Value (RelocatableAddress): 0x40
-;CHECKSYM-NEXT:     Section: .text
-;CHECKSYM-NEXT:     Type: 0x0
-;CHECKSYM-NEXT:     StorageClass: C_HIDEXT (0x6B)
-;CHECKSYM-NEXT:     NumberOfAuxEntries: 1
-;CHECKSYM-NEXT:     CSECT Auxiliary Entry {
-;CHECKSYM-NEXT:       Index: [[#Index+7]]
-;CHECKSYM-NEXT:       ContainingCsectSymbolIndex: [[#Index]]
-;CHECKSYM-NEXT:       ParameterHashIndex: 0x0
-;CHECKSYM-NEXT:       TypeChkSectNum: 0x0
-;CHECKSYM-NEXT:       SymbolAlignmentLog2: 0
-;CHECKSYM-NEXT:       SymbolType: XTY_LD (0x2)
-;CHECKSYM-NEXT:       StorageMappingClass: XMC_RO (0x1)
-;CHECKSYM-NEXT:       StabInfoIndex: 0x0
-;CHECKSYM-NEXT:       StabSectNum: 0x0
-;CHECKSYM-NEXT:     }
-;CHECKSYM-NEXT:   }
-;CHECKSYM-NEXT:   Symbol {
-;CHECKSYM-NEXT:     Index: [[#Index+8]]
-;CHECKSYM-NEXT:     Name: .L__const.main.cnst4
-;CHECKSYM-NEXT:     Value (RelocatableAddress): 0x48
-;CHECKSYM-NEXT:     Section: .text
-;CHECKSYM-NEXT:     Type: 0x0
-;CHECKSYM-NEXT:     StorageClass: C_HIDEXT (0x6B)
-;CHECKSYM-NEXT:     NumberOfAuxEntries: 1
-;CHECKSYM-NEXT:     CSECT Auxiliary Entry {
-;CHECKSYM-NEXT:       Index: [[#Index+9]]
-;CHECKSYM-NEXT:       ContainingCsectSymbolIndex: [[#Index]]
-;CHECKSYM-NEXT:       ParameterHashIndex: 0x0
-;CHECKSYM-NEXT:       TypeChkSectNum: 0x0
-;CHECKSYM-NEXT:       SymbolAlignmentLog2: 0
-;CHECKSYM-NEXT:       SymbolType: XTY_LD (0x2)
-;CHECKSYM-NEXT:       StorageMappingClass: XMC_RO (0x1)
-;CHECKSYM-NEXT:       StabInfoIndex: 0x0
-;CHECKSYM-NEXT:       StabSectNum: 0x0
-;CHECKSYM-NEXT:     }
-;CHECKSYM-NEXT:   }
index db622a9..6a53d65 100644 (file)
@@ -78,9 +78,6 @@ entry:
 ; CHECKOBJ-NEXT:       28: 68 65 6c 6c
 ; CHECKOBJ-NEXT:       2c: 6f 20 77 6f
 ; CHECKOBJ-NEXT:       30: 72 6c 64 21
-; CHECKOBJ-NEXT:       34: 0a 00 61 62    {{.*}}{{[[:space:]] *}}
-; CHECKOBJ-NEXT: 00000036 .L.str:
-; CHECKOBJ-NEXT:       36: 61 62 63 64
-; CHECKOBJ-NEXT:       3a: 65 66 67 68
-; CHECKOBJ-NEXT:       3e: 00
-; CHECKOBJ-NEXT:       3f: 00
+; CHECKOBJ-NEXT:       34: 0a 00 61 62
+; CHECKOBJ-NEXT:       38: 63 64 65 66
+; CHECKOBJ-NEXT:       3c: 67 68 00 00