The current implementation generates a csect with a
".rodata.str.x.y" prefix for a MergeableCString variable definition.
However, a reference to such variable does not get the prefix in its
name because there's not enough information in the containing IR.
In particular, without seeing the initializer and absent of some other
indicators, we cannot tell that the referenced variable is a null-
terminated string.
When the AIX codegen in llvm was being developed, the prefixing was copied
from ELF without having the linker take advantage of the info.
Currently, the AIX linker does not have the capability to merge
MergeableCString variables. If such feature would ever get implemented,
the contract between the linker and compiler would have to be reconsidered.
Here's the before and after of this change:
```
@a = global i64 320255973571806, align 8
@strA = unnamed_addr constant [7 x i8] c"hello\0A\00", align 1 ;; Mergeable1ByteCString
@strB = unnamed_addr constant [8 x i8] c"Blahah\0A\00", align 1 ;; Mergeable1ByteCString
@strC = unnamed_addr constant [2 x i16] [i16 1, i16 0], align 2 ;; Mergeable2ByteCString
@strD = unnamed_addr constant [2 x i16] [i16 1, i16 1], align 2 ;; !isMergeableCString
@strE = external unnamed_addr constant [2 x i16], align 2
-fdata-sections:
.text extern .rodata.str1.1strA .text extern strA
0 SD RO 0 SD RO
.text extern .rodata.str1.1strB .text extern strB
0 SD RO 0 SD RO
.text extern .rodata.str2.2strC ===> .text extern strC
0 SD RO 0 SD RO
.text extern strD .text extern strD
0 SD RO 0 SD RO
.data extern a .data extern a
0 SD RW 0 SD RW
undef extern strE undef extern strE
0 ER UA 0 ER UA
-fno-data-sections:
.text unamex .rodata.str1.1 .text unamex .rodata
0 SD RO 0 SD RO
.text extern strA .text extern strA
0 LD RO 0 LD RO
.text extern strB .text extern strB
0 LD RO 0 LD RO
.text unamex .rodata.str2.2 ===> .text extern strC
0 SD RO 0 LD RO
.text extern strC .text extern strD
0 LD RO 0 LD RO
.text unamex .rodata .data unamex .data
0 SD RO 0 SD RW
.text extern strD .data extern a
0 LD RO 0 LD RW
.data unamex .data undef extern strE
0 SD RW 0 ER UA
.data extern a
0 LD RW
undef extern strE
0 ER UA
```
Reviewed by: David Tenty, Fangrui Song
Differential Revision: https://reviews.llvm.org/D156202
338 lines
13 KiB
LLVM
338 lines
13 KiB
LLVM
; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec -mtriple powerpc-ibm-aix-xcoff \
|
|
; RUN: -data-sections -xcoff-traceback-table=false < %s | \
|
|
; RUN: FileCheck --check-prefixes=CHECK,CHECK32 %s
|
|
; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec -mtriple powerpc64-ibm-aix-xcoff -data-sections < %s | \
|
|
; RUN: FileCheck --check-prefixes=CHECK,CHECK64 %s
|
|
; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec -mtriple powerpc-ibm-aix-xcoff \
|
|
; RUN: -filetype=obj -data-sections -xcoff-traceback-table=false -o %t.o < %s
|
|
; RUN: llvm-objdump -D --symbol-description %t.o | FileCheck --check-prefix=CHECKOBJ %s
|
|
; RUN: llvm-readobj -s %t.o | FileCheck --check-prefix=CHECKSYM %s
|
|
|
|
;; Test to see if the default is correct for -data-sections on AIX.
|
|
; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec -mtriple powerpc-ibm-aix-xcoff \
|
|
; RUN: -xcoff-traceback-table=false < %s | \
|
|
; RUN: FileCheck --check-prefixes=CHECK,CHECK32 %s
|
|
; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec -mtriple powerpc64-ibm-aix-xcoff < %s | \
|
|
; RUN: FileCheck --check-prefixes=CHECK,CHECK64 %s
|
|
; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec -mtriple powerpc-ibm-aix-xcoff \
|
|
; RUN: -xcoff-traceback-table=false -filetype=obj -o %t.o < %s
|
|
; RUN: llvm-objdump -D --symbol-description %t.o | FileCheck --check-prefix=CHECKOBJ %s
|
|
; RUN: llvm-readobj -s %t.o | FileCheck --check-prefix=CHECKSYM %s
|
|
|
|
;; Test to see if the default is correct for -data-sections on AIX.
|
|
; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec -mtriple powerpc-ibm-aix-xcoff \
|
|
; RUN: -xcoff-traceback-table=false < %s | \
|
|
; RUN: FileCheck --check-prefixes=CHECK,CHECK32 %s
|
|
; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec -mtriple powerpc64-ibm-aix-xcoff \
|
|
; RUN: -xcoff-traceback-table=false < %s | \
|
|
; RUN: FileCheck --check-prefixes=CHECK,CHECK64 %s
|
|
; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec -mtriple powerpc-ibm-aix-xcoff \
|
|
; RUN: -xcoff-traceback-table=false -filetype=obj -o %t.o < %s
|
|
; RUN: llvm-objdump -D --symbol-description %t.o | FileCheck --check-prefix=CHECKOBJ %s
|
|
; RUN: llvm-readobj -s %t.o | FileCheck --check-prefix=CHECKSYM %s
|
|
|
|
@ivar = local_unnamed_addr global i32 35, align 4
|
|
@const_ivar = constant i32 35, align 4
|
|
|
|
@a = common global i32 0, align 4
|
|
@f = common local_unnamed_addr global i32 0, align 4
|
|
|
|
@.str = private unnamed_addr constant [9 x i8] c"abcdefgh\00", align 1
|
|
@p = global ptr @.str, align 4
|
|
|
|
define i8 @foo() {
|
|
entry:
|
|
%0 = load ptr, ptr @p, align 4
|
|
%1 = load i8, ptr %0, align 1
|
|
ret i8 %1
|
|
}
|
|
|
|
define i32 @bar() {
|
|
entry:
|
|
%0 = load i32, ptr @ivar, align 4
|
|
%1 = load i32, ptr @const_ivar, align 4
|
|
%add = add nsw i32 %0, %1
|
|
%2 = load i32, ptr @a, align 4
|
|
%add1 = add nsw i32 %add, %2
|
|
%3 = load i32, ptr @f, align 4
|
|
%add2 = add nsw i32 %add1, %3
|
|
ret i32 %add2
|
|
}
|
|
|
|
|
|
; CHECK: .csect ivar[RW],2
|
|
; CHECK-NEXT: .globl ivar[RW]
|
|
; CHECK-NEXT: .align 2
|
|
; CHECK-NEXT: .vbyte 4, 35 # 0x23
|
|
; CHECK-NEXT: .csect const_ivar[RO],2
|
|
; CHECK-NEXT: .globl const_ivar[RO]
|
|
; CHECK-NEXT: .align 2
|
|
; CHECK-NEXT: .vbyte 4, 35 # 0x23
|
|
; CHECK-NEXT: .comm a[RW],4,2
|
|
; CHECK-NEXT: .comm f[RW],4,2
|
|
; CHECK-NEXT: .csect L...str[RO],2
|
|
; CHECK-NEXT: .string "abcdefgh"
|
|
; CHECK32: .csect p[RW],2
|
|
; CHECK32-NEXT: .globl p[RW]
|
|
; CHECK32-NEXT: .align 2
|
|
; CHECK32-NEXT: .vbyte 4, L...str[RO]
|
|
; CHECK64: .csect p[RW],3
|
|
; CHECK64-NEXT: .globl p[RW]
|
|
; CHECK64-NEXT: .align 3
|
|
; CHECK64-NEXT: .vbyte 8, L...str[RO]
|
|
; CHECK: .toc
|
|
; CHECK-NEXT: L..C0:
|
|
; CHECK-NEXT: .tc p[TC],p[RW]
|
|
; CHECK-NEXT: L..C1:
|
|
; CHECK-NEXT: .tc ivar[TC],ivar[RW]
|
|
; CHECK-NEXT: L..C2:
|
|
; CHECK-NEXT: .tc a[TC],a[RW]
|
|
; CHECK-NEXT: L..C3:
|
|
; CHECK-NEXT: .tc f[TC],f[RW]
|
|
|
|
; CHECKOBJ: 00000038 (idx: 7) const_ivar[RO]:
|
|
; CHECKOBJ-NEXT: 38: 00 00 00 23 <unknown>
|
|
; CHECKOBJ-EMPTY:
|
|
; CHECKOBJ-NEXT: 0000003c (idx: 9) L...str[RO]:
|
|
; CHECKOBJ-NEXT: 3c: 61 62 63 64
|
|
; CHECKOBJ-NEXT: 40: 65 66 67 68
|
|
; CHECKOBJ-NEXT: 44: 00 00 00 00 <unknown>
|
|
; CHECKOBJ-EMPTY:
|
|
; CHECKOBJ-NEXT: Disassembly of section .data:
|
|
; CHECKOBJ-EMPTY:
|
|
; CHECKOBJ-NEXT: 00000048 (idx: 11) ivar[RW]:
|
|
; CHECKOBJ-NEXT: 48: 00 00 00 23 <unknown>
|
|
; CHECKOBJ-EMPTY:
|
|
; CHECKOBJ-NEXT: 0000004c (idx: 13) p[RW]:
|
|
; CHECKOBJ-NEXT: 4c: 00 00 00 3c <unknown>
|
|
; CHECKOBJ-EMPTY:
|
|
; CHECKOBJ-NEXT: 00000050 (idx: 15) foo[DS]:
|
|
; CHECKOBJ-NEXT: 50: 00 00 00 00 <unknown>
|
|
; CHECKOBJ-NEXT: 54: 00 00 00 68 <unknown>
|
|
; CHECKOBJ-NEXT: 58: 00 00 00 00 <unknown>
|
|
; CHECKOBJ-EMPTY:
|
|
; CHECKOBJ-NEXT: 0000005c (idx: 17) bar[DS]:
|
|
; CHECKOBJ-NEXT: 5c: 00 00 00 10 <unknown>
|
|
; CHECKOBJ-NEXT: 60: 00 00 00 68 <unknown>
|
|
; CHECKOBJ-NEXT: 64: 00 00 00 00 <unknown>
|
|
; CHECKOBJ-EMPTY:
|
|
; CHECKOBJ-NEXT: 00000068 (idx: 21) p[TC]:
|
|
; CHECKOBJ-NEXT: 68: 00 00 00 4c <unknown>
|
|
; CHECKOBJ-EMPTY:
|
|
; CHECKOBJ-NEXT: 0000006c (idx: 23) ivar[TC]:
|
|
; CHECKOBJ-NEXT: 6c: 00 00 00 48 <unknown>
|
|
; CHECKOBJ-EMPTY:
|
|
; CHECKOBJ-NEXT: 00000070 (idx: 25) a[TC]:
|
|
; CHECKOBJ-NEXT: 70: 00 00 00 78 <unknown>
|
|
; CHECKOBJ-EMPTY:
|
|
; CHECKOBJ-NEXT: 00000074 (idx: 27) f[TC]:
|
|
; CHECKOBJ-NEXT: 74: 00 00 00 7c <unknown>
|
|
; CHECKOBJ-EMPTY:
|
|
; CHECKOBJ-NEXT: Disassembly of section .bss:
|
|
; CHECKOBJ-EMPTY:
|
|
; CHECKOBJ-NEXT: 00000078 (idx: 29) a[RW]:
|
|
; CHECKOBJ-NEXT: ...
|
|
; CHECKOBJ-EMPTY:
|
|
; CHECKOBJ-NEXT: 0000007c (idx: 31) f[RW]:
|
|
; CHECKOBJ-NEXT: ...
|
|
|
|
|
|
; CHECKSYM: Symbol {
|
|
; CHECKSYM: Name: const_ivar
|
|
; CHECKSYM: Value (RelocatableAddress): 0x38
|
|
; CHECKSYM: Section: .text
|
|
; CHECKSYM: Type: 0x0
|
|
; CHECKSYM: StorageClass: C_EXT (0x2)
|
|
; CHECKSYM: NumberOfAuxEntries: 1
|
|
; CHECKSYM: CSECT Auxiliary Entry {
|
|
; CHECKSYM: SectionLen: 4
|
|
; CHECKSYM: ParameterHashIndex: 0x0
|
|
; CHECKSYM: TypeChkSectNum: 0x0
|
|
; CHECKSYM: SymbolAlignmentLog2: 2
|
|
; CHECKSYM: SymbolType: XTY_SD (0x1)
|
|
; CHECKSYM: StorageMappingClass: XMC_RO (0x1)
|
|
; CHECKSYM: StabInfoIndex: 0x0
|
|
; CHECKSYM: StabSectNum: 0x0
|
|
; CHECKSYM: }
|
|
; CHECKSYM: }
|
|
; CHECKSYM: Symbol {
|
|
; CHECKSYM: Name: L...str
|
|
; CHECKSYM: Value (RelocatableAddress): 0x3C
|
|
; CHECKSYM: Section: .text
|
|
; CHECKSYM: Type: 0x0
|
|
; CHECKSYM: StorageClass: C_HIDEXT (0x6B)
|
|
; CHECKSYM: NumberOfAuxEntries: 1
|
|
; CHECKSYM: CSECT Auxiliary Entry {
|
|
; CHECKSYM: SectionLen: 9
|
|
; CHECKSYM: ParameterHashIndex: 0x0
|
|
; CHECKSYM: TypeChkSectNum: 0x0
|
|
; CHECKSYM: SymbolAlignmentLog2: 2
|
|
; CHECKSYM: SymbolType: XTY_SD (0x1)
|
|
; CHECKSYM: StorageMappingClass: XMC_RO (0x1)
|
|
; CHECKSYM: StabInfoIndex: 0x0
|
|
; CHECKSYM: StabSectNum: 0x0
|
|
; CHECKSYM: }
|
|
; CHECKSYM: }
|
|
; CHECKSYM: Symbol {
|
|
; CHECKSYM: Name: ivar
|
|
; CHECKSYM: Value (RelocatableAddress): 0x48
|
|
; CHECKSYM: Section: .data
|
|
; CHECKSYM: Type: 0x0
|
|
; CHECKSYM: StorageClass: C_EXT (0x2)
|
|
; CHECKSYM: NumberOfAuxEntries: 1
|
|
; CHECKSYM: CSECT Auxiliary Entry {
|
|
; CHECKSYM: SectionLen: 4
|
|
; CHECKSYM: ParameterHashIndex: 0x0
|
|
; CHECKSYM: TypeChkSectNum: 0x0
|
|
; CHECKSYM: SymbolAlignmentLog2: 2
|
|
; CHECKSYM: SymbolType: XTY_SD (0x1)
|
|
; CHECKSYM: StorageMappingClass: XMC_RW (0x5)
|
|
; CHECKSYM: StabInfoIndex: 0x0
|
|
; CHECKSYM: StabSectNum: 0x0
|
|
; CHECKSYM: }
|
|
; CHECKSYM: }
|
|
; CHECKSYM: Symbol {
|
|
; CHECKSYM: Name: p
|
|
; CHECKSYM: Value (RelocatableAddress): 0x4C
|
|
; CHECKSYM: Section: .data
|
|
; CHECKSYM: Type: 0x0
|
|
; CHECKSYM: StorageClass: C_EXT (0x2)
|
|
; CHECKSYM: NumberOfAuxEntries: 1
|
|
; CHECKSYM: CSECT Auxiliary Entry {
|
|
; CHECKSYM: SectionLen: 4
|
|
; CHECKSYM: ParameterHashIndex: 0x0
|
|
; CHECKSYM: TypeChkSectNum: 0x0
|
|
; CHECKSYM: SymbolAlignmentLog2: 2
|
|
; CHECKSYM: SymbolType: XTY_SD (0x1)
|
|
; CHECKSYM: StorageMappingClass: XMC_RW (0x5)
|
|
; CHECKSYM: StabInfoIndex: 0x0
|
|
; CHECKSYM: StabSectNum: 0x0
|
|
; CHECKSYM: }
|
|
; CHECKSYM: }
|
|
; CHECKSYM: Symbol {
|
|
; CHECKSYM: Name: TOC
|
|
; CHECKSYM: Value (RelocatableAddress): 0x68
|
|
; CHECKSYM: Section: .data
|
|
; CHECKSYM: Type: 0x0
|
|
; CHECKSYM: StorageClass: C_HIDEXT (0x6B)
|
|
; CHECKSYM: NumberOfAuxEntries: 1
|
|
; CHECKSYM: CSECT Auxiliary Entry {
|
|
; CHECKSYM: SectionLen: 0
|
|
; CHECKSYM: ParameterHashIndex: 0x0
|
|
; CHECKSYM: TypeChkSectNum: 0x0
|
|
; CHECKSYM: SymbolAlignmentLog2: 2
|
|
; CHECKSYM: SymbolType: XTY_SD (0x1)
|
|
; CHECKSYM: StorageMappingClass: XMC_TC0 (0xF)
|
|
; CHECKSYM: StabInfoIndex: 0x0
|
|
; CHECKSYM: StabSectNum: 0x0
|
|
; CHECKSYM: }
|
|
; CHECKSYM: }
|
|
; CHECKSYM: Symbol {
|
|
; CHECKSYM: Name: p
|
|
; CHECKSYM: Value (RelocatableAddress): 0x68
|
|
; CHECKSYM: Section: .data
|
|
; CHECKSYM: Type: 0x0
|
|
; CHECKSYM: StorageClass: C_HIDEXT (0x6B)
|
|
; CHECKSYM: NumberOfAuxEntries: 1
|
|
; CHECKSYM: CSECT Auxiliary Entry {
|
|
; CHECKSYM: SectionLen: 4
|
|
; CHECKSYM: ParameterHashIndex: 0x0
|
|
; CHECKSYM: TypeChkSectNum: 0x0
|
|
; CHECKSYM: SymbolAlignmentLog2: 2
|
|
; CHECKSYM: SymbolType: XTY_SD (0x1)
|
|
; CHECKSYM: StorageMappingClass: XMC_TC (0x3)
|
|
; CHECKSYM: StabInfoIndex: 0x0
|
|
; CHECKSYM: StabSectNum: 0x0
|
|
; CHECKSYM: }
|
|
; CHECKSYM: }
|
|
; CHECKSYM: Symbol {
|
|
; CHECKSYM: Name: ivar
|
|
; CHECKSYM: Value (RelocatableAddress): 0x6C
|
|
; CHECKSYM: Section: .data
|
|
; CHECKSYM: Type: 0x0
|
|
; CHECKSYM: StorageClass: C_HIDEXT (0x6B)
|
|
; CHECKSYM: NumberOfAuxEntries: 1
|
|
; CHECKSYM: CSECT Auxiliary Entry {
|
|
; CHECKSYM: SectionLen: 4
|
|
; CHECKSYM: ParameterHashIndex: 0x0
|
|
; CHECKSYM: TypeChkSectNum: 0x0
|
|
; CHECKSYM: SymbolAlignmentLog2: 2
|
|
; CHECKSYM: SymbolType: XTY_SD (0x1)
|
|
; CHECKSYM: StorageMappingClass: XMC_TC (0x3)
|
|
; CHECKSYM: StabInfoIndex: 0x0
|
|
; CHECKSYM: StabSectNum: 0x0
|
|
; CHECKSYM: }
|
|
; CHECKSYM: }
|
|
; CHECKSYM: Symbol {
|
|
; CHECKSYM: Name: a
|
|
; CHECKSYM: Value (RelocatableAddress): 0x70
|
|
; CHECKSYM: Section: .data
|
|
; CHECKSYM: Type: 0x0
|
|
; CHECKSYM: StorageClass: C_HIDEXT (0x6B)
|
|
; CHECKSYM: NumberOfAuxEntries: 1
|
|
; CHECKSYM: CSECT Auxiliary Entry {
|
|
; CHECKSYM: SectionLen: 4
|
|
; CHECKSYM: ParameterHashIndex: 0x0
|
|
; CHECKSYM: TypeChkSectNum: 0x0
|
|
; CHECKSYM: SymbolAlignmentLog2: 2
|
|
; CHECKSYM: SymbolType: XTY_SD (0x1)
|
|
; CHECKSYM: StorageMappingClass: XMC_TC (0x3)
|
|
; CHECKSYM: StabInfoIndex: 0x0
|
|
; CHECKSYM: StabSectNum: 0x0
|
|
; CHECKSYM: }
|
|
; CHECKSYM: }
|
|
; CHECKSYM: Symbol {
|
|
; CHECKSYM: Name: f
|
|
; CHECKSYM: Value (RelocatableAddress): 0x74
|
|
; CHECKSYM: Section: .data
|
|
; CHECKSYM: Type: 0x0
|
|
; CHECKSYM: StorageClass: C_HIDEXT (0x6B)
|
|
; CHECKSYM: NumberOfAuxEntries: 1
|
|
; CHECKSYM: CSECT Auxiliary Entry {
|
|
; CHECKSYM: SectionLen: 4
|
|
; CHECKSYM: ParameterHashIndex: 0x0
|
|
; CHECKSYM: TypeChkSectNum: 0x0
|
|
; CHECKSYM: SymbolAlignmentLog2: 2
|
|
; CHECKSYM: SymbolType: XTY_SD (0x1)
|
|
; CHECKSYM: StorageMappingClass: XMC_TC (0x3)
|
|
; CHECKSYM: StabInfoIndex: 0x0
|
|
; CHECKSYM: StabSectNum: 0x0
|
|
; CHECKSYM: }
|
|
; CHECKSYM: }
|
|
; CHECKSYM: Symbol {
|
|
; CHECKSYM: Name: a
|
|
; CHECKSYM: Value (RelocatableAddress): 0x78
|
|
; CHECKSYM: Section: .bss
|
|
; CHECKSYM: Type: 0x0
|
|
; CHECKSYM: StorageClass: C_EXT (0x2)
|
|
; CHECKSYM: NumberOfAuxEntries: 1
|
|
; CHECKSYM: CSECT Auxiliary Entry {
|
|
; CHECKSYM: SectionLen: 4
|
|
; CHECKSYM: ParameterHashIndex: 0x0
|
|
; CHECKSYM: TypeChkSectNum: 0x0
|
|
; CHECKSYM: SymbolAlignmentLog2: 2
|
|
; CHECKSYM: SymbolType: XTY_CM (0x3)
|
|
; CHECKSYM: StorageMappingClass: XMC_RW (0x5)
|
|
; CHECKSYM: StabInfoIndex: 0x0
|
|
; CHECKSYM: StabSectNum: 0x0
|
|
; CHECKSYM: }
|
|
; CHECKSYM: }
|
|
; CHECKSYM: Symbol {
|
|
; CHECKSYM: Name: f
|
|
; CHECKSYM: Value (RelocatableAddress): 0x7C
|
|
; CHECKSYM: Section: .bss
|
|
; CHECKSYM: Type: 0x0
|
|
; CHECKSYM: StorageClass: C_EXT (0x2)
|
|
; CHECKSYM: NumberOfAuxEntries: 1
|
|
; CHECKSYM: CSECT Auxiliary Entry {
|
|
; CHECKSYM: SectionLen: 4
|
|
; CHECKSYM: ParameterHashIndex: 0x0
|
|
; CHECKSYM: TypeChkSectNum: 0x0
|
|
; CHECKSYM: SymbolAlignmentLog2: 2
|
|
; CHECKSYM: SymbolType: XTY_CM (0x3)
|
|
; CHECKSYM: StorageMappingClass: XMC_RW (0x5)
|
|
; CHECKSYM: StabInfoIndex: 0x0
|
|
; CHECKSYM: StabSectNum: 0x0
|
|
; CHECKSYM: }
|
|
; CHECKSYM: }
|