DiggerLin updated this revision to Diff 257319.
DiggerLin marked 2 inline comments as done.
DiggerLin added a comment.
address comment and add a new test case
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D76932/new/
https://reviews.llvm.org/D76932
Files:
clang/lib/Driver/ToolChains/AIX.cpp
clang/test/Driver/aix-as.c
llvm/include/llvm/MC/MCAsmInfo.h
llvm/include/llvm/MC/MCDirectives.h
llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
llvm/lib/MC/MCAsmInfoXCOFF.cpp
llvm/lib/MC/MCAsmStreamer.cpp
llvm/lib/MC/MCXCOFFStreamer.cpp
llvm/lib/MC/XCOFFObjectWriter.cpp
llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
llvm/test/CodeGen/PowerPC/aix-LinkOnceAnyLinkage.ll
llvm/test/CodeGen/PowerPC/aix-LinkOnceODRLinkage.ll
llvm/test/CodeGen/PowerPC/aix-WeakODRLinkage.ll
llvm/test/CodeGen/PowerPC/aix-extern-weak.ll
llvm/test/CodeGen/PowerPC/aix-extern.ll
llvm/test/CodeGen/PowerPC/aix-linkage.ll
llvm/test/CodeGen/PowerPC/aix-reference-func-addr-const.ll
llvm/test/CodeGen/PowerPC/aix-weak.ll
Index: llvm/test/CodeGen/PowerPC/aix-weak.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/PowerPC/aix-weak.ll
@@ -0,0 +1,358 @@
+; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff -mcpu=pwr4 \
+; RUN: -mattr=-altivec < %s | FileCheck --check-prefixes=COMMON,BIT32 %s
+
+; RUN: llc -verify-machineinstrs -mtriple powerpc64-ibm-aix-xcoff -mcpu=pwr4 \
+; RUN: -mattr=-altivec < %s | FileCheck --check-prefixes=COMMON,BIT64 %s
+
+; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff -mcpu=pwr4 \
+; RUN: -mattr=-altivec -filetype=obj -o %t.o < %s
+; RUN: llvm-readobj --symbols %t.o | FileCheck --check-prefix=CHECKSYM %s
+
+@foo_weak_p = global void (...)* bitcast (void ()* @foo_ref_weak to void (...)*), align 4
+@b = weak global i32 0, align 4
+
+define weak void @foo_weak(i32* %p) {
+entry:
+ %p.addr = alloca i32*, align 4
+ store i32* %p, i32** %p.addr, align 4
+ %0 = load i32*, i32** %p.addr, align 4
+ %1 = load i32, i32* %0, align 4
+ %inc = add nsw i32 %1, 1
+ store i32 %inc, i32* %0, align 4
+ ret void
+}
+
+define weak void @foo_ref_weak() {
+entry:
+ ret void
+}
+
+define i32 @main() {
+entry:
+ %0 = load void (...)*, void (...)** @foo_weak_p, align 4
+ %callee.knr.cast = bitcast void (...)* %0 to void ()*
+ call void %callee.knr.cast()
+ call void @foo_weak(i32* @b)
+ call void @foo_ref_weak()
+ ret i32 0
+}
+
+; COMMON: .weak foo_weak[DS] # -- Begin function foo_weak
+; COMMON-NEXT: .weak .foo_weak
+; COMMON-NEXT: .align 4
+; COMMON-NEXT: .csect foo_weak[DS]
+; BIT32-NEXT: .long .foo_weak # @foo_weak
+; BIT32-NEXT: .long TOC[TC0]
+; BIT32-NEXT: .long 0
+; BIT64-NEXT: .llong .foo_weak # @foo_weak
+; BIT64-NEXT: .llong TOC[TC0]
+; BIT64-NEXT: .llong 0
+; COMMON-NEXT: .csect .text[PR]
+; COMMON-NEXT: .foo_weak:
+
+; COMMON: .weak foo_ref_weak[DS] # -- Begin function foo_ref_weak
+; COMMON-NEXT: .weak .foo_ref_weak
+; COMMON-NEXT: .align 4
+; COMMON-NEXT: .csect foo_ref_weak[DS]
+; BIT32-NEXT: .long .foo_ref_weak # @foo_ref_weak
+; BIT32-NEXT: .long TOC[TC0]
+; BIT32-NEXT: .long 0
+; BIT64-NEXT: .llong .foo_ref_weak # @foo_ref_weak
+; BIT64-NEXT: .llong TOC[TC0]
+; BIT64-NEXT: .llong 0
+; COMMON-NEXT: .csect .text[PR]
+; COMMON-NEXT: .foo_ref_weak:
+
+; COMMON: .globl main[DS] # -- Begin function main
+; COMMON-NEXT: .globl .main
+; COMMON-NEXT: .align 4
+; COMMON-NEXT: .csect main[DS]
+; BIT32-NEXT: .long .main # @main
+; BIT32-NEXT: .long TOC[TC0]
+; BIT32-NEXT: .long 0
+; BIT64-NEXT: .llong .main # @main
+; BIT64-NEXT: .llong TOC[TC0]
+; BIT64-NEXT: .llong 0
+; COMMON-NEXT: .csect .text[PR]
+; COMMON-NEXT: .main:
+
+; COMMON: .csect .data[RW]
+; COMMON-NEXT: .globl foo_weak_p
+; BIT32-NEXT: .align 2
+; BIT64-NEXT: .align 3
+; COMMON-NEXT: foo_weak_p:
+; BIT32-NEXT: .long foo_ref_weak[DS]
+; BIT64-NEXT: .llong foo_ref_weak[DS]
+; COMMON-NEXT: .weak b
+; COMMON-NEXT: .align 2
+; COMMON-NEXT: b:
+; COMMON-NEXT: .long 0 # 0x0
+; COMMON-NEXT: .toc
+; COMMON-NEXT: LC0:
+; COMMON-NEXT: .tc foo_weak_p[TC],foo_weak_p
+; COMMON-NEXT: LC1:
+; COMMON-NEXT: .tc b[TC],b
+
+
+; CHECKSYM: Symbols [
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index:]]
+; CHECKSYM-NEXT: Name: .text
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x0
+; 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+1]]
+; CHECKSYM-NEXT: SectionLen: 136
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 4
+; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_PR (0x0)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+2]]
+; CHECKSYM-NEXT: Name: .foo_weak
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x0
+; CHECKSYM-NEXT: Section: .text
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_WEAKEXT (0x6F)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+3]]
+; CHECKSYM-NEXT: ContainingCsectSymbolIndex: 0
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 0
+; CHECKSYM-NEXT: SymbolType: XTY_LD (0x2)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_PR (0x0)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+4]]
+; CHECKSYM-NEXT: Name: .foo_ref_weak
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x20
+; CHECKSYM-NEXT: Section: .text
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_WEAKEXT (0x6F)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+5]]
+; CHECKSYM-NEXT: ContainingCsectSymbolIndex: 0
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 0
+; CHECKSYM-NEXT: SymbolType: XTY_LD (0x2)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_PR (0x0)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+6]]
+; CHECKSYM-NEXT: Name: .main
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x30
+; CHECKSYM-NEXT: Section: .text
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_EXT (0x2)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+7]]
+; CHECKSYM-NEXT: ContainingCsectSymbolIndex: 0
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 0
+; CHECKSYM-NEXT: SymbolType: XTY_LD (0x2)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_PR (0x0)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+8]]
+; CHECKSYM-NEXT: Name: .data
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x88
+; CHECKSYM-NEXT: Section: .data
+; 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: SectionLen: 8
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 2
+; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_RW (0x5)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+10]]
+; CHECKSYM-NEXT: Name: foo_weak_p
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x88
+; CHECKSYM-NEXT: Section: .data
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_EXT (0x2)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+11]]
+; CHECKSYM-NEXT: ContainingCsectSymbolIndex: 8
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 0
+; CHECKSYM-NEXT: SymbolType: XTY_LD (0x2)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_RW (0x5)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+12]]
+; CHECKSYM-NEXT: Name: b
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x8C
+; CHECKSYM-NEXT: Section: .data
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_WEAKEXT (0x6F)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+13]]
+; CHECKSYM-NEXT: ContainingCsectSymbolIndex: 8
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 0
+; CHECKSYM-NEXT: SymbolType: XTY_LD (0x2)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_RW (0x5)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+14]]
+; CHECKSYM-NEXT: Name: foo_weak
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x90
+; CHECKSYM-NEXT: Section: .data
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_WEAKEXT (0x6F)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+15]]
+; CHECKSYM-NEXT: SectionLen: 12
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 2
+; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_DS (0xA)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+16]]
+; CHECKSYM-NEXT: Name: foo_ref_weak
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x9C
+; CHECKSYM-NEXT: Section: .data
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_WEAKEXT (0x6F)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+17]]
+; CHECKSYM-NEXT: SectionLen: 12
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 2
+; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_DS (0xA)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+18]]
+; CHECKSYM-NEXT: Name: main
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0xA8
+; CHECKSYM-NEXT: Section: .data
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_EXT (0x2)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+19]]
+; CHECKSYM-NEXT: SectionLen: 12
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 2
+; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_DS (0xA)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+20]]
+; CHECKSYM-NEXT: Name: TOC
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0xB4
+; CHECKSYM-NEXT: Section: .data
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_HIDEXT (0x6B)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+21]]
+; CHECKSYM-NEXT: SectionLen: 0
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 2
+; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_TC0 (0xF)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+22]]
+; CHECKSYM-NEXT: Name: foo_weak_p
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0xB4
+; CHECKSYM-NEXT: Section: .data
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_HIDEXT (0x6B)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+23]]
+; CHECKSYM-NEXT: SectionLen: 4
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 2
+; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_TC (0x3)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+24]]
+; CHECKSYM-NEXT: Name: b
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0xB8
+; CHECKSYM-NEXT: Section: .data
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_HIDEXT (0x6B)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+25]]
+; CHECKSYM-NEXT: SectionLen: 4
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 2
+; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_TC (0x3)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: ]
Index: llvm/test/CodeGen/PowerPC/aix-reference-func-addr-const.ll
===================================================================
--- llvm/test/CodeGen/PowerPC/aix-reference-func-addr-const.ll
+++ llvm/test/CodeGen/PowerPC/aix-reference-func-addr-const.ll
@@ -20,6 +20,7 @@
;CHECK-NEXT: .align 2
;CHECK-NEXT: bar_ptr1:
;CHECK-NEXT: .long bar[DS]
+;CHECK-NEXT: .extern foo[DS]
;CHECK64: .csect .data[RW]
;CHECK64-NEXT: .globl foo_ptr
@@ -30,3 +31,4 @@
;CHECK64-NEXT: .align 3
;CHECK64-NEXT: bar_ptr1:
;CHECK64-NEXT: .llong bar[DS]
+;CHECK64-NEXT: .extern foo[DS]
Index: llvm/test/CodeGen/PowerPC/aix-linkage.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/PowerPC/aix-linkage.ll
@@ -0,0 +1,283 @@
+; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff -mcpu=pwr4 \
+; RUN: -mattr=-altivec < %s | FileCheck --check-prefixes=COMMON,BIT32 %s
+
+; RUN: llc -verify-machineinstrs -mtriple powerpc64-ibm-aix-xcoff -mcpu=pwr4 \
+; RUN: -mattr=-altivec < %s | FileCheck --check-prefixes=COMMON,BIT64 %s
+
+; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff -mcpu=pwr4 \
+; RUN: -mattr=-altivec -filetype=obj -o %t.o < %s
+; RUN: llvm-readobj --symbols %t.o | FileCheck --check-prefix=CHECKSYM %s
+
+
+@foo_refed_p = global void (...)* @foo_refed
+@foo_called_refed_p = global void (...)* @foo_called_refed
+
+declare void @foo_refed(...)
+
+declare void @foo_called_refed(...)
+
+; Function Attrs: noinline nounwind optnone
+define void @main() {
+entry:
+ call void bitcast (void (...)* @foo_called to void ()*)()
+ call void bitcast (void (...)* @foo_called_refed to void ()*)()
+ ret void
+}
+
+declare void @foo_called(...)
+
+; COMMON: .globl main[DS] # -- Begin function main
+; COMMON-NEXT: .globl .main
+; COMMON-NEXT: .align 4
+; COMMON-NEXT: .csect main[DS]
+; BIT32-NEXT: .long .main # @main
+; BIT32-NEXT: .long TOC[TC0]
+; BIT32-NEXT: .long 0
+; BIT64-NEXT: .llong .main # @main
+; BIT64-NEXT: .llong TOC[TC0]
+; BIT64-NEXT: .llong 0
+; COMMON-NEXT: .csect .text[PR]
+; COMMON-NEXT: .main:
+
+; COMMON: .csect .data[RW]
+; COMMON-NEXT: .globl foo_refed_p
+; BIT32-NEXT: .align 2
+; BIT64-NEXT: .align 3
+; COMMON-NEXT: foo_refed_p:
+; BIT32-NEXT: .long foo_refed[DS]
+; BIT64-NEXT: .llong foo_refed[DS]
+; COMMON-NEXT: .globl foo_called_refed_p
+; BIT32-NEXT: .align 2
+; BIT64-NEXT: .align 3
+; COMMON-NEXT: foo_called_refed_p:
+; BIT32-NEXT: .long foo_called_refed[DS]
+; BIT64-NEXT: .llong foo_called_refed[DS]
+
+; COMMON-NEXT: .extern foo_refed[DS]
+; COMMON-NEXT: .extern .foo_called_refed
+; COMMON-NEXT: .extern foo_called_refed[DS]
+; COMMON-NEXT: .extern .foo_called
+; COMMON-NEXT: .toc
+
+; CHECKSYM: Symbols [
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index:]]
+; CHECKSYM-NEXT: Name: .foo_called
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x0
+; CHECKSYM-NEXT: Section: N_UNDEF
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_EXT (0x2)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+1]]
+; CHECKSYM-NEXT: SectionLen: 0
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 0
+; CHECKSYM-NEXT: SymbolType: XTY_ER (0x0)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_PR (0x0)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+2]]
+; CHECKSYM-NEXT: Name: .foo_called_refed
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x0
+; CHECKSYM-NEXT: Section: N_UNDEF
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_EXT (0x2)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+3]]
+; CHECKSYM-NEXT: SectionLen: 0
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 0
+; CHECKSYM-NEXT: SymbolType: XTY_ER (0x0)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_PR (0x0)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+4]]
+; CHECKSYM-NEXT: Name: foo_refed
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x0
+; CHECKSYM-NEXT: Section: N_UNDEF
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_EXT (0x2)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+5]]
+; CHECKSYM-NEXT: SectionLen: 0
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 0
+; CHECKSYM-NEXT: SymbolType: XTY_ER (0x0)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_DS (0xA)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+6]]
+; CHECKSYM-NEXT: Name: foo_called_refed
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x0
+; CHECKSYM-NEXT: Section: N_UNDEF
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_EXT (0x2)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+7]]
+; CHECKSYM-NEXT: SectionLen: 0
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 0
+; CHECKSYM-NEXT: SymbolType: XTY_ER (0x0)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_DS (0xA)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+8]]
+; CHECKSYM-NEXT: Name: .text
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x0
+; 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: SectionLen: 44
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 4
+; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_PR (0x0)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+10]]
+; CHECKSYM-NEXT: Name: .main
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x0
+; CHECKSYM-NEXT: Section: .text
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_EXT (0x2)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+11]]
+; CHECKSYM-NEXT: ContainingCsectSymbolIndex: 8
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 0
+; CHECKSYM-NEXT: SymbolType: XTY_LD (0x2)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_PR (0x0)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+12]]
+; CHECKSYM-NEXT: Name: .data
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x2C
+; CHECKSYM-NEXT: Section: .data
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_HIDEXT (0x6B)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+13]]
+; CHECKSYM-NEXT: SectionLen: 8
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 2
+; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_RW (0x5)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+14]]
+; CHECKSYM-NEXT: Name: foo_refed_p
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x2C
+; CHECKSYM-NEXT: Section: .data
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_EXT (0x2)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+15]]
+; CHECKSYM-NEXT: ContainingCsectSymbolIndex: 12
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 0
+; CHECKSYM-NEXT: SymbolType: XTY_LD (0x2)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_RW (0x5)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+16]]
+; CHECKSYM-NEXT: Name: foo_called_refed_p
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x30
+; CHECKSYM-NEXT: Section: .data
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_EXT (0x2)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+17]]
+; CHECKSYM-NEXT: ContainingCsectSymbolIndex: 12
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 0
+; CHECKSYM-NEXT: SymbolType: XTY_LD (0x2)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_RW (0x5)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+18]]
+; CHECKSYM-NEXT: Name: main
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x34
+; CHECKSYM-NEXT: Section: .data
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_EXT (0x2)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+19]]
+; CHECKSYM-NEXT: SectionLen: 12
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 2
+; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_DS (0xA)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+20]]
+; CHECKSYM-NEXT: Name: TOC
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x40
+; CHECKSYM-NEXT: Section: .data
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_HIDEXT (0x6B)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+21]]
+; CHECKSYM-NEXT: SectionLen: 0
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 2
+; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_TC0 (0xF)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: ]
Index: llvm/test/CodeGen/PowerPC/aix-extern.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/PowerPC/aix-extern.ll
@@ -0,0 +1,360 @@
+; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff -mcpu=pwr4 \
+; RUN: -mattr=-altivec < %s | FileCheck --check-prefixes=COMMON,BIT32 %s
+
+; RUN: llc -verify-machineinstrs -mtriple powerpc64-ibm-aix-xcoff -mcpu=pwr4 \
+; RUN: -mattr=-altivec < %s | FileCheck --check-prefixes=COMMON,BIT64 %s
+
+; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff -mcpu=pwr4 \
+; RUN: -mattr=-altivec -filetype=obj -o %t.o < %s
+; RUN: llvm-readobj --symbols %t.o | FileCheck --check-prefix=CHECKSYM %s
+
+@bar_p = global i32 (...)* @bar_ref, align 4
+@b_e = external global i32, align 4
+
+; Function Attrs: noinline nounwind optnone
+define void @foo() #0 {
+entry:
+ ret void
+}
+
+declare i32 @bar_ref(...)
+
+; Function Attrs: noinline nounwind optnone
+define i32 @main() {
+entry:
+ %call = call i32 @bar_extern(i32* @b_e)
+ call void @foo()
+ %0 = load i32 (...)*, i32 (...)** @bar_p, align 4
+ %callee.knr.cast = bitcast i32 (...)* %0 to i32 ()*
+ %call1 = call i32 %callee.knr.cast()
+ %call2 = call i32 bitcast (i32 (...)* @bar_ref to i32 ()*)()
+ ret i32 0
+}
+
+declare i32 @bar_extern(i32*)
+
+; COMMON: .globl foo[DS] # -- Begin function foo
+; COMMON-NEXT: .globl .foo
+; COMMON-NEXT: .align 4
+; COMMON-NEXT: .csect foo[DS]
+; BIT32-NEXT: .long .foo # @foo
+; BIT32-NEXT: .long TOC[TC0]
+; BIT32-NEXT: .long 0
+; BIT64-NEXT: .llong .foo # @foo
+; BIT64-NEXT: .llong TOC[TC0]
+; BIT64-NEXT: .llong 0
+; COMMON-NEXT: .csect .text[PR]
+; COMMON-NEXT: .foo:
+
+; COMMON: .globl main[DS] # -- Begin function main
+; COMMON-NEXT: .globl .main
+; COMMON-NEXT: .align 4
+; COMMON-NEXT: .csect main[DS]
+; BIT32-NEXT: .long .main # @main
+; BIT32-NEXT: .long TOC[TC0]
+; BIT32-NEXT: .long 0
+; BIT64-NEXT: .llong .main # @main
+; BIT64-NEXT: .llong TOC[TC0]
+; BIT64-NEXT: .llong 0
+; COMMON-NEXT: .csect .text[PR]
+; COMMON-NEXT: .main:
+
+; COMMON: .csect .data[RW]
+; COMMON-NEXT: .globl bar_p
+; BIT32-NEXT: .align 2
+; BIT64-NEXT: .align 3
+; COMMON-NEXT: bar_p:
+; BIT32-NEXT: .long bar_ref[DS]
+; BIT64-NEXT: .llong bar_ref[DS]
+; COMMON-NEXT: .extern b_e[UA]
+; COMMON-NEXT: .extern .bar_ref
+; COMMON-NEXT: .extern bar_ref[DS]
+; COMMON-NEXT: .extern .bar_extern
+; COMMON-NEXT: .toc
+; COMMON-NEXT: LC0:
+; COMMON-NEXT: .tc b_e[TC],b_e[UA]
+; COMMON-NEXT: LC1:
+; COMMON-NEXT: .tc bar_p[TC],bar_p
+
+; CHECKSYM: Symbols [
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index:]]
+; CHECKSYM-NEXT: Name: .bar_extern
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x0
+; CHECKSYM-NEXT: Section: N_UNDEF
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_EXT (0x2)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+1]]
+; CHECKSYM-NEXT: SectionLen: 0
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 0
+; CHECKSYM-NEXT: SymbolType: XTY_ER (0x0)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_PR (0x0)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+2]]
+; CHECKSYM-NEXT: Name: .bar_ref
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x0
+; CHECKSYM-NEXT: Section: N_UNDEF
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_EXT (0x2)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+3]]
+; CHECKSYM-NEXT: SectionLen: 0
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 0
+; CHECKSYM-NEXT: SymbolType: XTY_ER (0x0)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_PR (0x0)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+4]]
+; CHECKSYM-NEXT: Name: bar_ref
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x0
+; CHECKSYM-NEXT: Section: N_UNDEF
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_EXT (0x2)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+5]]
+; CHECKSYM-NEXT: SectionLen: 0
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 0
+; CHECKSYM-NEXT: SymbolType: XTY_ER (0x0)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_DS (0xA)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+6]]
+; CHECKSYM-NEXT: Name: b_e
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x0
+; CHECKSYM-NEXT: Section: N_UNDEF
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_EXT (0x2)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+7]]
+; CHECKSYM-NEXT: SectionLen: 0
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 0
+; CHECKSYM-NEXT: SymbolType: XTY_ER (0x0)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_UA (0x4)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+8]]
+; CHECKSYM-NEXT: Name: .text
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x0
+; 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: SectionLen: 112
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 4
+; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_PR (0x0)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+10]]
+; CHECKSYM-NEXT: Name: .foo
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x0
+; CHECKSYM-NEXT: Section: .text
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_EXT (0x2)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+11]]
+; CHECKSYM-NEXT: ContainingCsectSymbolIndex: 8
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 0
+; CHECKSYM-NEXT: SymbolType: XTY_LD (0x2)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_PR (0x0)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+12]]
+; CHECKSYM-NEXT: Name: .main
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x10
+; CHECKSYM-NEXT: Section: .text
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_EXT (0x2)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+13]]
+; CHECKSYM-NEXT: ContainingCsectSymbolIndex: 8
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 0
+; CHECKSYM-NEXT: SymbolType: XTY_LD (0x2)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_PR (0x0)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+14]]
+; CHECKSYM-NEXT: Name: .data
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x70
+; CHECKSYM-NEXT: Section: .data
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_HIDEXT (0x6B)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+15]]
+; CHECKSYM-NEXT: SectionLen: 4
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 2
+; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_RW (0x5)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+16]]
+; CHECKSYM-NEXT: Name: bar_p
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x70
+; CHECKSYM-NEXT: Section: .data
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_EXT (0x2)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+17]]
+; CHECKSYM-NEXT: ContainingCsectSymbolIndex: 14
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 0
+; CHECKSYM-NEXT: SymbolType: XTY_LD (0x2)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_RW (0x5)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+18]]
+; CHECKSYM-NEXT: Name: foo
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x74
+; CHECKSYM-NEXT: Section: .data
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_EXT (0x2)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+19]]
+; CHECKSYM-NEXT: SectionLen: 12
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 2
+; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_DS (0xA)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+20]]
+; CHECKSYM-NEXT: Name: main
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x80
+; CHECKSYM-NEXT: Section: .data
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_EXT (0x2)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+21]]
+; CHECKSYM-NEXT: SectionLen: 12
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 2
+; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_DS (0xA)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+22]]
+; CHECKSYM-NEXT: Name: TOC
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x8C
+; CHECKSYM-NEXT: Section: .data
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_HIDEXT (0x6B)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+23]]
+; CHECKSYM-NEXT: SectionLen: 0
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 2
+; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_TC0 (0xF)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+24]]
+; CHECKSYM-NEXT: Name: b_e
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x8C
+; CHECKSYM-NEXT: Section: .data
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_HIDEXT (0x6B)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+25]]
+; CHECKSYM-NEXT: SectionLen: 4
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 2
+; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_TC (0x3)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+26]]
+; CHECKSYM-NEXT: Name: bar_p
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x90
+; CHECKSYM-NEXT: Section: .data
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_HIDEXT (0x6B)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+27]]
+; CHECKSYM-NEXT: SectionLen: 4
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 2
+; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_TC (0x3)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: ]
Index: llvm/test/CodeGen/PowerPC/aix-extern-weak.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/PowerPC/aix-extern-weak.ll
@@ -0,0 +1,277 @@
+; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff -mcpu=pwr4 \
+; RUN: -mattr=-altivec < %s | FileCheck --check-prefixes=COMMON,BIT32 %s
+
+; RUN: llc -verify-machineinstrs -mtriple powerpc64-ibm-aix-xcoff -mcpu=pwr4 \
+; RUN: -mattr=-altivec < %s | FileCheck --check-prefixes=COMMON,BIT64 %s
+
+; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff -mcpu=pwr4 \
+; RUN: -mattr=-altivec -filetype=obj -o %t.o < %s
+; RUN: llvm-readobj --symbols %t.o | FileCheck --check-prefix=CHECKSYM %s
+
+@foo_ext_weak_p = global void (...)* bitcast (void ()* @foo_ext_weak_ref to void (...)*)
+@b_w = extern_weak global i32
+
+declare extern_weak void @foo_ext_weak_ref()
+
+define i32 @main() {
+entry:
+ %0 = load void (...)*, void (...)** @foo_ext_weak_p
+ %callee.knr.cast = bitcast void (...)* %0 to void ()*
+ call void %callee.knr.cast()
+ call void @foo_ext_weak(i32* @b_w)
+ ret i32 0
+}
+
+declare extern_weak void @foo_ext_weak(i32*)
+
+; COMMON: .globl main[DS] # -- Begin function main
+; COMMON-NEXT: .globl .main
+; COMMON-NEXT: .align 4
+; COMMON-NEXT: .csect main[DS]
+; BIT32-NEXT: .long .main # @main
+; BIT32-NEXT: .long TOC[TC0]
+; BIT32-NEXT: .long 0
+; BIT64-NEXT: .llong .main # @main
+; BIT64-NEXT: .llong TOC[TC0]
+; BIT64-NEXT: .llong 0
+; COMMON-NEXT: .csect .text[PR]
+; COMMON-NEXT: .main:
+
+; COMMON: .csect .data[RW]
+; COMMON: .globl foo_ext_weak_p
+; BIT32-NEXT: .align 2
+; BIT64-NEXT: .align 3
+; COMMON-NEXT: foo_ext_weak_p:
+; BIT32-NEXT: .long foo_ext_weak_ref[DS]
+; BIT64-NEXT: .llong foo_ext_weak_ref[DS]
+; COMMON-NEXT: .weak b_w[UA]
+; COMMON-NEXT: .weak foo_ext_weak_ref[DS]
+; COMMON-NEXT: .weak .foo_ext_weak
+; COMMON-NEXT: .toc
+; COMMON-NEXT: LC0:
+; COMMON-NEXT: .tc foo_ext_weak_p[TC],foo_ext_weak_p
+; COMMON-NEXT: LC1:
+; COMMON-NEXT: .tc b_w[TC],b_w[UA]
+
+; CHECKSYM: Symbols [
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index:]]
+; CHECKSYM-NEXT: Name: .foo_ext_weak
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x0
+; CHECKSYM-NEXT: Section: N_UNDEF
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_WEAKEXT (0x6F)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+1]]
+; CHECKSYM-NEXT: SectionLen: 0
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 0
+; CHECKSYM-NEXT: SymbolType: XTY_ER (0x0)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_PR (0x0)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+2]]
+; CHECKSYM-NEXT: Name: foo_ext_weak_ref
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x0
+; CHECKSYM-NEXT: Section: N_UNDEF
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_WEAKEXT (0x6F)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+3]]
+; CHECKSYM-NEXT: SectionLen: 0
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 0
+; CHECKSYM-NEXT: SymbolType: XTY_ER (0x0)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_DS (0xA)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+4]]
+; CHECKSYM-NEXT: Name: b_w
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x0
+; CHECKSYM-NEXT: Section: N_UNDEF
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_WEAKEXT (0x6F)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+5]]
+; CHECKSYM-NEXT: SectionLen: 0
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 0
+; CHECKSYM-NEXT: SymbolType: XTY_ER (0x0)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_UA (0x4)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+6]]
+; CHECKSYM-NEXT: Name: .text
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x0
+; 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: SectionLen: 80
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 4
+; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_PR (0x0)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+8]]
+; CHECKSYM-NEXT: Name: .main
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x0
+; CHECKSYM-NEXT: Section: .text
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_EXT (0x2)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+9]]
+; CHECKSYM-NEXT: ContainingCsectSymbolIndex: 6
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 0
+; CHECKSYM-NEXT: SymbolType: XTY_LD (0x2)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_PR (0x0)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+10]]
+; CHECKSYM-NEXT: Name: .data
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x50
+; CHECKSYM-NEXT: Section: .data
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_HIDEXT (0x6B)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+11]]
+; CHECKSYM-NEXT: SectionLen: 4
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 2
+; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_RW (0x5)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+12]]
+; CHECKSYM-NEXT: Name: foo_ext_weak_p
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x50
+; CHECKSYM-NEXT: Section: .data
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_EXT (0x2)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+13]]
+; CHECKSYM-NEXT: ContainingCsectSymbolIndex: 10
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 0
+; CHECKSYM-NEXT: SymbolType: XTY_LD (0x2)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_RW (0x5)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+14]]
+; CHECKSYM-NEXT: Name: main
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x54
+; CHECKSYM-NEXT: Section: .data
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_EXT (0x2)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+15]]
+; CHECKSYM-NEXT: SectionLen: 12
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 2
+; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_DS (0xA)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+16]]
+; CHECKSYM-NEXT: Name: TOC
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x60
+; CHECKSYM-NEXT: Section: .data
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_HIDEXT (0x6B)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+17]]
+; CHECKSYM-NEXT: SectionLen: 0
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 2
+; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_TC0 (0xF)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: [[#Index+18]]
+; CHECKSYM-NEXT: Name: foo_ext_weak_p
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x60
+; CHECKSYM-NEXT: Section: .data
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_HIDEXT (0x6B)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: [[#Index+19]]
+; CHECKSYM-NEXT: SectionLen: 4
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 2
+; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_TC (0x3)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: Symbol {
+; CHECKSYM-NEXT: Index: 20
+; CHECKSYM-NEXT: Name: b_w
+; CHECKSYM-NEXT: Value (RelocatableAddress): 0x64
+; CHECKSYM-NEXT: Section: .data
+; CHECKSYM-NEXT: Type: 0x0
+; CHECKSYM-NEXT: StorageClass: C_HIDEXT (0x6B)
+; CHECKSYM-NEXT: NumberOfAuxEntries: 1
+; CHECKSYM-NEXT: CSECT Auxiliary Entry {
+; CHECKSYM-NEXT: Index: 21
+; CHECKSYM-NEXT: SectionLen: 4
+; CHECKSYM-NEXT: ParameterHashIndex: 0x0
+; CHECKSYM-NEXT: TypeChkSectNum: 0x0
+; CHECKSYM-NEXT: SymbolAlignmentLog2: 2
+; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1)
+; CHECKSYM-NEXT: StorageMappingClass: XMC_TC (0x3)
+; CHECKSYM-NEXT: StabInfoIndex: 0x0
+; CHECKSYM-NEXT: StabSectNum: 0x0
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: }
+; CHECKSYM-NEXT: ]
Index: llvm/test/CodeGen/PowerPC/aix-WeakODRLinkage.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/PowerPC/aix-WeakODRLinkage.ll
@@ -0,0 +1,13 @@
+; RUN: llc -mtriple powerpc-ibm-aix-xcoff < %s | \
+; RUN: FileCheck %s
+
+; RUN: llc -mtriple powerpc64-ibm-aix-xcoff < %s | \
+; RUN: FileCheck %s
+
+define weak_odr void @_Z3fooIiEvT_() {
+entry:
+ ret void
+}
+
+; CHECK: .weak _Z3fooIiEvT_[DS]
+; CHECK: .weak ._Z3fooIiEvT_
Index: llvm/test/CodeGen/PowerPC/aix-LinkOnceODRLinkage.ll
===================================================================
--- llvm/test/CodeGen/PowerPC/aix-LinkOnceODRLinkage.ll
+++ llvm/test/CodeGen/PowerPC/aix-LinkOnceODRLinkage.ll
@@ -9,5 +9,5 @@
ret void
}
-; CHECK: .weak _Z3fooIiEvT_
+; CHECK: .weak _Z3fooIiEvT_[DS]
; CHECK: .weak ._Z3fooIiEvT_
Index: llvm/test/CodeGen/PowerPC/aix-LinkOnceAnyLinkage.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/PowerPC/aix-LinkOnceAnyLinkage.ll
@@ -0,0 +1,13 @@
+; RUN: llc -mtriple powerpc-ibm-aix-xcoff < %s | \
+; RUN: FileCheck %s
+
+; RUN: llc -mtriple powerpc64-ibm-aix-xcoff < %s | \
+; RUN: FileCheck %s
+
+define linkonce void @_Z3fooIiEvT_() {
+entry:
+ ret void
+}
+
+; CHECK: .weak _Z3fooIiEvT_[DS]
+; CHECK: .weak ._Z3fooIiEvT_
Index: llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
===================================================================
--- llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
+++ llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
@@ -1639,8 +1639,10 @@
TM));
// External global variables are already handled.
- if (GV->isDeclaration())
+ if (GV->isDeclaration()) {
+ emitLinkage(GV, Csect->getQualNameSymbol());
return;
+ }
if (!GVKind.isGlobalWriteableData() && !GVKind.isReadOnly())
report_fatal_error("Encountered a global variable kind that is "
Index: llvm/lib/MC/XCOFFObjectWriter.cpp
===================================================================
--- llvm/lib/MC/XCOFFObjectWriter.cpp
+++ llvm/lib/MC/XCOFFObjectWriter.cpp
@@ -353,21 +353,24 @@
// Handle undefined symbol.
UndefinedCsects.emplace_back(ContainingCsect);
SectionMap[ContainingCsect] = &UndefinedCsects.back();
- } else {
- // If the symbol is the csect itself, we don't need to put the symbol
- // into csect's Syms.
- if (XSym == ContainingCsect->getQualNameSymbol())
- continue;
+ if (nameShouldBeInStringTable(ContainingCsect->getSectionName()))
+ Strings.add(ContainingCsect->getSectionName());
+ continue;
+ }
- // Only put a label into the symbol table when it is an external label.
- if (!XSym->isExternal())
- continue;
+ // If the symbol is the csect itself, we don't need to put the symbol
+ // into csect's Syms.
+ if (XSym == ContainingCsect->getQualNameSymbol())
+ continue;
- assert(SectionMap.find(ContainingCsect) != SectionMap.end() &&
- "Expected containing csect to exist in map");
- // Lookup the containing csect and add the symbol to it.
- SectionMap[ContainingCsect]->Syms.emplace_back(XSym);
- }
+ // 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.
+ SectionMap[ContainingCsect]->Syms.emplace_back(XSym);
// If the name does not fit in the storage provided in the symbol table
// entry, add it to the string table.
Index: llvm/lib/MC/MCXCOFFStreamer.cpp
===================================================================
--- llvm/lib/MC/MCXCOFFStreamer.cpp
+++ llvm/lib/MC/MCXCOFFStreamer.cpp
@@ -35,6 +35,7 @@
switch (Attribute) {
case MCSA_Global:
+ case MCSA_Extern:
Symbol->setStorageClass(XCOFF::C_EXT);
Symbol->setExternal(true);
break;
@@ -42,6 +43,10 @@
Symbol->setStorageClass(XCOFF::C_HIDEXT);
Symbol->setExternal(true);
break;
+ case llvm::MCSA_Weak:
+ Symbol->setStorageClass(XCOFF::C_WEAKEXT);
+ Symbol->setExternal(true);
+ break;
default:
report_fatal_error("Not implemented yet.");
}
Index: llvm/lib/MC/MCAsmStreamer.cpp
===================================================================
--- llvm/lib/MC/MCAsmStreamer.cpp
+++ llvm/lib/MC/MCAsmStreamer.cpp
@@ -675,6 +675,9 @@
break;
case MCSA_Protected: OS << "\t.protected\t"; break;
case MCSA_Reference: OS << "\t.reference\t"; break;
+ case MCSA_Extern:
+ OS << "\t.extern\t";
+ break;
case MCSA_Weak: OS << MAI->getWeakDirective(); break;
case MCSA_WeakDefinition:
OS << "\t.weak_definition\t";
Index: llvm/lib/MC/MCAsmInfoXCOFF.cpp
===================================================================
--- llvm/lib/MC/MCAsmInfoXCOFF.cpp
+++ llvm/lib/MC/MCAsmInfoXCOFF.cpp
@@ -15,6 +15,7 @@
MCAsmInfoXCOFF::MCAsmInfoXCOFF() {
IsLittleEndian = false;
HasDotTypeDotSizeDirective = false;
+ HasDotExternDirective = true;
COMMDirectiveAlignmentIsInBytes = false;
LCOMMDirectiveAlignmentType = LCOMM::Log2Alignment;
UseDotAlignForAlignment = true;
Index: llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
===================================================================
--- llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
+++ llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
@@ -2011,6 +2011,9 @@
return XCOFF::C_EXT;
case GlobalValue::ExternalWeakLinkage:
case GlobalValue::LinkOnceODRLinkage:
+ case GlobalValue::LinkOnceAnyLinkage:
+ case GlobalValue::WeakAnyLinkage:
+ case GlobalValue::WeakODRLinkage:
return XCOFF::C_WEAKEXT;
case GlobalValue::AppendingLinkage:
report_fatal_error(
Index: llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
===================================================================
--- llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
@@ -401,6 +401,8 @@
GlobalValue::LinkageTypes Linkage = GV->getLinkage();
switch (Linkage) {
case GlobalValue::CommonLinkage:
+ assert(!TM.getTargetTriple().isOSBinFormatXCOFF() &&
+ "CommonLinkage of XCOFF should not come to this path.");
case GlobalValue::LinkOnceAnyLinkage:
case GlobalValue::LinkOnceODRLinkage:
case GlobalValue::WeakAnyLinkage:
@@ -424,8 +426,10 @@
}
return;
case GlobalValue::ExternalLinkage:
- // If external, declare as a global symbol: .globl _foo
- OutStreamer->emitSymbolAttribute(GVSym, MCSA_Global);
+ if (MAI->hasDotExternDirective() && GV->isDeclaration())
+ OutStreamer->emitSymbolAttribute(GVSym, MCSA_Extern);
+ else
+ OutStreamer->emitSymbolAttribute(GVSym, MCSA_Global);
return;
case GlobalValue::PrivateLinkage:
return;
@@ -433,9 +437,14 @@
if (MAI->hasDotLGloblDirective())
OutStreamer->emitSymbolAttribute(GVSym, MCSA_LGlobal);
return;
+ case GlobalValue::ExternalWeakLinkage:
+ if (TM.getTargetTriple().isOSBinFormatXCOFF()) {
+ OutStreamer->emitSymbolAttribute(GVSym, MCSA_Weak);
+ return;
+ } else
+ llvm_unreachable("Should never emit this");
case GlobalValue::AppendingLinkage:
case GlobalValue::AvailableExternallyLinkage:
- case GlobalValue::ExternalWeakLinkage:
llvm_unreachable("Should never emit this");
}
llvm_unreachable("Unknown linkage type!");
@@ -1479,15 +1488,36 @@
// Emit remaining GOT equivalent globals.
emitGlobalGOTEquivs();
- // Emit visibility info for declarations
+ // Emit linkage(XCOFF) and visibility info for declarations
for (const Function &F : M) {
if (!F.isDeclarationForLinker())
continue;
+
+ MCSymbol *Name = getSymbol(&F);
+ if (TM.getTargetTriple().isOSBinFormatXCOFF() && !F.isIntrinsic()) {
+
+ // Get the function entry point symbol.
+ MCSymbol *FnEntryPointSym =
+ OutContext.getOrCreateSymbol("." + Name->getName());
+ if (cast<MCSymbolXCOFF>(FnEntryPointSym)->hasRepresentedCsectSet())
+ emitLinkage(&F, FnEntryPointSym);
+
+ MCSymbol *FnQualNameSymbol = OutContext.lookupSymbol(
+ Name->getName() + "[" + XCOFF::getMappingClassString(XCOFF::XMC_DS) +
+ "]");
+ if (FnQualNameSymbol) {
+ // If there is a function description, we need to emit linkage
+ // for its function descriptor symbol. For example c source code as:
+ // extern int bar_ext();
+ // int (*bar_p) = bar_ext;
+ emitLinkage(&F, FnQualNameSymbol);
+ }
+ }
+
GlobalValue::VisibilityTypes V = F.getVisibility();
if (V == GlobalValue::DefaultVisibility)
continue;
- MCSymbol *Name = getSymbol(&F);
emitVisibility(Name, V, false);
}
Index: llvm/include/llvm/MC/MCDirectives.h
===================================================================
--- llvm/include/llvm/MC/MCDirectives.h
+++ llvm/include/llvm/MC/MCDirectives.h
@@ -29,6 +29,7 @@
MCSA_ELF_TypeGnuUniqueObject, /// .type _foo, @gnu_unique_object
MCSA_Global, ///< .globl
MCSA_LGlobal, ///< .lglobl (XCOFF)
+ MCSA_Extern, ///< .extern (XCOFF)
MCSA_Hidden, ///< .hidden (ELF)
MCSA_IndirectSymbol, ///< .indirect_symbol (MachO)
MCSA_Internal, ///< .internal (ELF)
Index: llvm/include/llvm/MC/MCAsmInfo.h
===================================================================
--- llvm/include/llvm/MC/MCAsmInfo.h
+++ llvm/include/llvm/MC/MCAsmInfo.h
@@ -307,6 +307,10 @@
/// false.
bool HasAltEntry = false;
+ /// True if this target supports the XCOFF .extern directive. Defaults to
+ /// false.
+ bool HasDotExternDirective = false;
+
/// Used to declare a global as being a weak symbol. Defaults to ".weak".
const char *WeakDirective;
@@ -583,6 +587,7 @@
bool hasIdentDirective() const { return HasIdentDirective; }
bool hasNoDeadStrip() const { return HasNoDeadStrip; }
bool hasAltEntry() const { return HasAltEntry; }
+ bool hasDotExternDirective() const { return HasDotExternDirective; }
const char *getWeakDirective() const { return WeakDirective; }
const char *getWeakRefDirective() const { return WeakRefDirective; }
bool hasWeakDefDirective() const { return HasWeakDefDirective; }
Index: clang/test/Driver/aix-as.c
===================================================================
--- clang/test/Driver/aix-as.c
+++ clang/test/Driver/aix-as.c
@@ -9,7 +9,6 @@
// CHECK-AS32: {{.*}}clang{{(.exe)?}}" "-cc1" "-triple" "powerpc-ibm-aix7.1.0.0"
// CHECK-AS32: "{{.*}}as{{(.exe)?}}"
// CHECK-AS32: "-a32"
-// CHECK-AS32: "-u"
// CHECK-AS32: "-many"
// Check powerpc64-ibm-aix7.1.0.0, 64-bit.
@@ -20,7 +19,6 @@
// CHECK-AS64: {{.*}}clang{{(.exe)?}}" "-cc1" "-triple" "powerpc64-ibm-aix7.1.0.0"
// CHECK-AS64: "{{.*}}as{{(.exe)?}}"
// CHECK-AS64: "-a64"
-// CHECK-AS64: "-u"
// CHECK-AS64: "-many"
// Check powerpc-ibm-aix7.1.0.0, 32-bit. -Xassembler <arg> option.
@@ -32,7 +30,6 @@
// CHECK-AS32-Xassembler: {{.*}}clang{{(.exe)?}}" "-cc1" "-triple" "powerpc-ibm-aix7.1.0.0"
// CHECK-AS32-Xassembler: "{{.*}}as{{(.exe)?}}"
// CHECK-AS32-Xassembler: "-a32"
-// CHECK-AS32-Xassembler: "-u"
// CHECK-AS32-Xassembler: "-many"
// CHECK-AS32-Xassembler: "-w"
@@ -45,7 +42,6 @@
// CHECK-AS64-Wa: {{.*}}clang{{(.exe)?}}" "-cc1" "-triple" "powerpc64-ibm-aix7.1.0.0"
// CHECK-AS64-Wa: "{{.*}}as{{(.exe)?}}"
// CHECK-AS64-Wa: "-a64"
-// CHECK-AS64-Wa: "-u"
// CHECK-AS64-Wa: "-many"
// CHECK-AS64-Wa: "-v"
// CHECK-AS64-Wa: "-w"
@@ -60,13 +56,10 @@
// CHECK-AS32-MultiInput-NOT: warning:
// CHECK-AS32-MultiInput: "{{.*}}as{{(.exe)?}}"
// CHECK-AS32-MultiInput: "-a32"
-// CHECK-AS32-MultiInput: "-u"
// CHECK-AS32-MultiInput: "-many"
// CHECK-AS32-MultiInput: "{{.*}}as{{(.exe)?}}"
// CHECK-AS32-MultiInput: "-a32"
-// CHECK-AS32-MultiInput: "-u"
// CHECK-AS32-MultiInput: "-many"
// CHECK-AS32-MultiInput: "{{.*}}as{{(.exe)?}}"
// CHECK-AS32-MultiInput: "-a32"
-// CHECK-AS32-MultiInput: "-u"
// CHECK-AS32-MultiInput: "-many"
Index: clang/lib/Driver/ToolChains/AIX.cpp
===================================================================
--- clang/lib/Driver/ToolChains/AIX.cpp
+++ clang/lib/Driver/ToolChains/AIX.cpp
@@ -41,12 +41,6 @@
CmdArgs.push_back("-a64");
}
- // Accept an undefined symbol as an extern so that an error message is not
- // displayed. Otherwise, undefined symbols are flagged with error messages.
- // FIXME: This should be removed when the assembly generation from the
- // compiler is able to write externs properly.
- CmdArgs.push_back("-u");
-
// Accept any mixture of instructions.
// On Power for AIX and Linux, this behaviour matches that of GCC for both the
// user-provided assembler source case and the compiler-produced assembler
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits