Skip to content

Commit d32fa59

Browse files
committed
[XCOFF] Don't emit non-external labels in the symbol table and handle MCSA_LGlobal
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
1 parent d4ad2ad commit d32fa59

File tree

5 files changed

+58
-97
lines changed

5 files changed

+58
-97
lines changed

llvm/lib/MC/MCXCOFFStreamer.cpp

+6-1
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,13 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13+
#include "llvm/MC/MCXCOFFStreamer.h"
1314
#include "llvm/BinaryFormat/XCOFF.h"
1415
#include "llvm/MC/MCAsmBackend.h"
1516
#include "llvm/MC/MCCodeEmitter.h"
17+
#include "llvm/MC/MCDirectives.h"
1618
#include "llvm/MC/MCObjectWriter.h"
1719
#include "llvm/MC/MCSymbolXCOFF.h"
18-
#include "llvm/MC/MCXCOFFStreamer.h"
1920
#include "llvm/Support/TargetRegistry.h"
2021

2122
using namespace llvm;
@@ -37,6 +38,10 @@ bool MCXCOFFStreamer::emitSymbolAttribute(MCSymbol *Sym,
3738
Symbol->setStorageClass(XCOFF::C_EXT);
3839
Symbol->setExternal(true);
3940
break;
41+
case MCSA_LGlobal:
42+
Symbol->setStorageClass(XCOFF::C_HIDEXT);
43+
Symbol->setExternal(true);
44+
break;
4045
default:
4146
report_fatal_error("Not implemented yet.");
4247
}

llvm/lib/MC/XCOFFObjectWriter.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,10 @@ void XCOFFObjectWriter::executePostLayoutBinding(MCAssembler &Asm,
353353
if (XSym == ContainingCsect->getQualNameSymbol())
354354
continue;
355355

356+
// Only put a label into the symbol table when it is an external label.
357+
if (!XSym->isExternal())
358+
continue;
359+
356360
assert(SectionMap.find(ContainingCsect) != SectionMap.end() &&
357361
"Expected containing csect to exist in map");
358362
// Lookup the containing csect and add the symbol to it.
+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
; RUN: llc -mtriple powerpc-ibm-aix -verify-machineinstrs -mcpu=pwr4 \
2+
; RUN: -filetype=obj -o %t.o < %s
3+
; RUN: llvm-readobj --syms %t.o | FileCheck %s
4+
; RUN: not --crash llc -mtriple powerpc64-ibm-aix -verify-machineinstrs -mcpu=pwr4 \
5+
; RUN: -filetype=obj -o %t.o < %s 2>&1 | FileCheck --check-prefix=64-CHECK %s
6+
7+
define internal i32 @foo() {
8+
ret i32 1
9+
}
10+
11+
; CHECK: Symbol {
12+
; CHECK: Name: .foo
13+
; CHECK-NEXT: Value (RelocatableAddress):
14+
; CHECK-NEXT: Section: .text
15+
; CHECK-NEXT: Type: 0x0
16+
; CHECK-NEXT: StorageClass: C_HIDEXT (0x6B)
17+
18+
; CHECK: Symbol {
19+
; CHECK-NEXT: Index: [[#INDX:]]
20+
; CHECK-NEXT: Name: foo
21+
; CHECK-NEXT: Value (RelocatableAddress):
22+
; CHECK-NEXT: Section: .data
23+
; CHECK-NEXT: Type: 0x0
24+
; CHECK-NEXT: StorageClass: C_HIDEXT (0x6B)
25+
; CHECK-NEXT: NumberOfAuxEntries: 1
26+
; CHECK-NEXT: CSECT Auxiliary Entry {
27+
; CHECK-NEXT: Index: [[#INDX+1]]
28+
; CHECK-NEXT: SectionLen: 12
29+
; CHECK-NEXT: ParameterHashIndex:
30+
; CHECK-NEXT: TypeChkSectNum:
31+
; CHECK-NEXT: SymbolAlignmentLog2:
32+
; CHECK-NEXT: SymbolType: XTY_SD (0x1)
33+
; CHECK-NEXT: StorageMappingClass: XMC_DS (0xA)
34+
35+
; Make sure no label is emitted.
36+
; CHECK-NOT: Name: foo
37+
38+
;64-CHECK: LLVM ERROR: 64-bit XCOFF object files are not supported yet.

llvm/test/CodeGen/PowerPC/aix-xcoff-mergeable-const.ll

+7-90
Original file line numberDiff line numberDiff line change
@@ -52,18 +52,15 @@ entry:
5252
;CHECKOBJ-NEXT: 4: 4e 80 00 20 blr
5353
;CHECKOBJ-NEXT: ...{{[[:space:]] *}}
5454
;CHECKOBJ-NEXT: 00000010 .rodata:
55-
;CHECKOBJ-NEXT: 10: 40 00 00 00 bdnzf 0, .+0
56-
;CHECKOBJ-NEXT: 14: 00 00 00 32 <unknown>
55+
;CHECKOBJ-NEXT: 10: 40 00 00 00
56+
;CHECKOBJ-NEXT: 14: 00 00 00 32
5757
;CHECKOBJ-NEXT: ...{{[[:space:]] *}}
58-
;CHECKOBJ-NEXT: 00000030 .L__const.main.cnst16:
59-
;CHECKOBJ-NEXT: 30: 40 00 00 00 bdnzf 0, .+0
60-
;CHECKOBJ-NEXT: 34: 00 00 00 16 <unknown>
58+
;CHECKOBJ-SAME: 30: 40 00 00 00
59+
;CHECKOBJ-NEXT: 34: 00 00 00 16
6160
;CHECKOBJ-NEXT: ...{{[[:space:]] *}}
62-
;CHECKOBJ-NEXT: 00000040 .L__const.main.cnst8:
63-
;CHECKOBJ-NEXT: 40: 40 00 00 08 bdnzf 0, .+8
64-
;CHECKOBJ-NEXT: 44: 00 00 00 00 <unknown>{{[[:space:]] *}}
65-
;CHECKOBJ-NEXT: 00000048 .L__const.main.cnst4:
66-
;CHECKOBJ-NEXT: 48: 40 08 00 00 bdnzf 8, .+0
61+
;CHECKOBJ-SAME: 40: 40 00 00 08
62+
;CHECKOBJ-NEXT: 44: 00 00 00 00
63+
;CHECKOBJ-NEXT: 48: 40 08 00 00
6764

6865

6966
;CHECKSYM: Symbol {{[{][[:space:]] *}}Index: [[#Index:]]{{[[:space:]] *}}Name: .rodata
@@ -84,83 +81,3 @@ entry:
8481
;CHECKSYM-NEXT: StabSectNum: 0x0
8582
;CHECKSYM-NEXT: }
8683
;CHECKSYM-NEXT: }
87-
;CHECKSYM-NEXT: Symbol {
88-
;CHECKSYM-NEXT: Index: [[#Index+2]]
89-
;CHECKSYM-NEXT: Name: .L__const.main.cnst32
90-
;CHECKSYM-NEXT: Value (RelocatableAddress): 0x10
91-
;CHECKSYM-NEXT: Section: .text
92-
;CHECKSYM-NEXT: Type: 0x0
93-
;CHECKSYM-NEXT: StorageClass: C_HIDEXT (0x6B)
94-
;CHECKSYM-NEXT: NumberOfAuxEntries: 1
95-
;CHECKSYM-NEXT: CSECT Auxiliary Entry {
96-
;CHECKSYM-NEXT: Index: [[#Index+3]]
97-
;CHECKSYM-NEXT: ContainingCsectSymbolIndex: [[#Index]]
98-
;CHECKSYM-NEXT: ParameterHashIndex: 0x0
99-
;CHECKSYM-NEXT: TypeChkSectNum: 0x0
100-
;CHECKSYM-NEXT: SymbolAlignmentLog2: 0
101-
;CHECKSYM-NEXT: SymbolType: XTY_LD (0x2)
102-
;CHECKSYM-NEXT: StorageMappingClass: XMC_RO (0x1)
103-
;CHECKSYM-NEXT: StabInfoIndex: 0x0
104-
;CHECKSYM-NEXT: StabSectNum: 0x0
105-
;CHECKSYM-NEXT: }
106-
;CHECKSYM-NEXT: }
107-
;CHECKSYM-NEXT: Symbol {
108-
;CHECKSYM-NEXT: Index: [[#Index+4]]
109-
;CHECKSYM-NEXT: Name: .L__const.main.cnst16
110-
;CHECKSYM-NEXT: Value (RelocatableAddress): 0x30
111-
;CHECKSYM-NEXT: Section: .text
112-
;CHECKSYM-NEXT: Type: 0x0
113-
;CHECKSYM-NEXT: StorageClass: C_HIDEXT (0x6B)
114-
;CHECKSYM-NEXT: NumberOfAuxEntries: 1
115-
;CHECKSYM-NEXT: CSECT Auxiliary Entry {
116-
;CHECKSYM-NEXT: Index: [[#Index+5]]
117-
;CHECKSYM-NEXT: ContainingCsectSymbolIndex: [[#Index]]
118-
;CHECKSYM-NEXT: ParameterHashIndex: 0x0
119-
;CHECKSYM-NEXT: TypeChkSectNum: 0x0
120-
;CHECKSYM-NEXT: SymbolAlignmentLog2: 0
121-
;CHECKSYM-NEXT: SymbolType: XTY_LD (0x2)
122-
;CHECKSYM-NEXT: StorageMappingClass: XMC_RO (0x1)
123-
;CHECKSYM-NEXT: StabInfoIndex: 0x0
124-
;CHECKSYM-NEXT: StabSectNum: 0x0
125-
;CHECKSYM-NEXT: }
126-
;CHECKSYM-NEXT: }
127-
;CHECKSYM-NEXT: Symbol {
128-
;CHECKSYM-NEXT: Index: [[#Index+6]]
129-
;CHECKSYM-NEXT: Name: .L__const.main.cnst8
130-
;CHECKSYM-NEXT: Value (RelocatableAddress): 0x40
131-
;CHECKSYM-NEXT: Section: .text
132-
;CHECKSYM-NEXT: Type: 0x0
133-
;CHECKSYM-NEXT: StorageClass: C_HIDEXT (0x6B)
134-
;CHECKSYM-NEXT: NumberOfAuxEntries: 1
135-
;CHECKSYM-NEXT: CSECT Auxiliary Entry {
136-
;CHECKSYM-NEXT: Index: [[#Index+7]]
137-
;CHECKSYM-NEXT: ContainingCsectSymbolIndex: [[#Index]]
138-
;CHECKSYM-NEXT: ParameterHashIndex: 0x0
139-
;CHECKSYM-NEXT: TypeChkSectNum: 0x0
140-
;CHECKSYM-NEXT: SymbolAlignmentLog2: 0
141-
;CHECKSYM-NEXT: SymbolType: XTY_LD (0x2)
142-
;CHECKSYM-NEXT: StorageMappingClass: XMC_RO (0x1)
143-
;CHECKSYM-NEXT: StabInfoIndex: 0x0
144-
;CHECKSYM-NEXT: StabSectNum: 0x0
145-
;CHECKSYM-NEXT: }
146-
;CHECKSYM-NEXT: }
147-
;CHECKSYM-NEXT: Symbol {
148-
;CHECKSYM-NEXT: Index: [[#Index+8]]
149-
;CHECKSYM-NEXT: Name: .L__const.main.cnst4
150-
;CHECKSYM-NEXT: Value (RelocatableAddress): 0x48
151-
;CHECKSYM-NEXT: Section: .text
152-
;CHECKSYM-NEXT: Type: 0x0
153-
;CHECKSYM-NEXT: StorageClass: C_HIDEXT (0x6B)
154-
;CHECKSYM-NEXT: NumberOfAuxEntries: 1
155-
;CHECKSYM-NEXT: CSECT Auxiliary Entry {
156-
;CHECKSYM-NEXT: Index: [[#Index+9]]
157-
;CHECKSYM-NEXT: ContainingCsectSymbolIndex: [[#Index]]
158-
;CHECKSYM-NEXT: ParameterHashIndex: 0x0
159-
;CHECKSYM-NEXT: TypeChkSectNum: 0x0
160-
;CHECKSYM-NEXT: SymbolAlignmentLog2: 0
161-
;CHECKSYM-NEXT: SymbolType: XTY_LD (0x2)
162-
;CHECKSYM-NEXT: StorageMappingClass: XMC_RO (0x1)
163-
;CHECKSYM-NEXT: StabInfoIndex: 0x0
164-
;CHECKSYM-NEXT: StabSectNum: 0x0
165-
;CHECKSYM-NEXT: }
166-
;CHECKSYM-NEXT: }

llvm/test/CodeGen/PowerPC/aix-xcoff-mergeable-str.ll

+3-6
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,6 @@ entry:
7878
; CHECKOBJ-NEXT: 28: 68 65 6c 6c
7979
; CHECKOBJ-NEXT: 2c: 6f 20 77 6f
8080
; CHECKOBJ-NEXT: 30: 72 6c 64 21
81-
; CHECKOBJ-NEXT: 34: 0a 00 61 62 {{.*}}{{[[:space:]] *}}
82-
; CHECKOBJ-NEXT: 00000036 .L.str:
83-
; CHECKOBJ-NEXT: 36: 61 62 63 64
84-
; CHECKOBJ-NEXT: 3a: 65 66 67 68
85-
; CHECKOBJ-NEXT: 3e: 00
86-
; CHECKOBJ-NEXT: 3f: 00
81+
; CHECKOBJ-NEXT: 34: 0a 00 61 62
82+
; CHECKOBJ-NEXT: 38: 63 64 65 66
83+
; CHECKOBJ-NEXT: 3c: 67 68 00 00

0 commit comments

Comments
 (0)