Compiler projects using llvm
; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff -mcpu=pwr4 \
; RUN:     -mattr=-altivec -function-sections < %s | \
; RUN:   FileCheck --check-prefix=ASM %s
; RUN: llc -verify-machineinstrs -mtriple powerpc64-ibm-aix-xcoff -mcpu=pwr4 \
; RUN:     -mattr=-altivec -function-sections < %s | \
; RUN:   FileCheck --check-prefix=ASM %s

@alias_foo = alias void (...), bitcast (void ()* @foo to void (...)*)

define void @foo() {
entry:
  ret void
}

define hidden void @hidden_foo() {
entry:
  ret void
}

define void @bar() {
entry:
  call void @foo()
  call void @static_overalign_foo()
  call void bitcast (void (...)* @alias_foo to void ()*)()
  call void bitcast (void (...)* @extern_foo to void ()*)()
  call void @hidden_foo()
  ret void
}

declare void @extern_foo(...)

define internal void @static_overalign_foo() align 64 {
entry:
  ret void
}

; ASM:        .csect .foo[PR],5
; ASM-NEXT:  	.globl	foo[DS]                         # -- Begin function foo
; ASM-NEXT:  	.globl	.foo[PR]
; ASM-NEXT:  	.align	4
; ASM-NEXT:  	.csect foo[DS]
; ASM-NEXT:  alias_foo:                                # @foo
; ASM-NEXT:  	.vbyte	{{[0-9]+}}, .foo[PR]
; ASM-NEXT:  	.vbyte	{{[0-9]+}}, TOC[TC0]
; ASM-NEXT:  	.vbyte	{{[0-9]+}}, 0
; ASM-NEXT:  	.csect .foo[PR],5
; ASM-NEXT:  .alias_foo:
; ASM-NEXT:  # %bb.0:                                # %entry
; ASM-NEXT:  	blr
; ASM:        .csect .hidden_foo[PR],5
; ASM-NEXT:  	.globl	hidden_foo[DS],hidden           # -- Begin function hidden_foo
; ASM-NEXT:  	.globl	.hidden_foo[PR],hidden
; ASM-NEXT:  	.align	4
; ASM-NEXT:  	.csect hidden_foo[DS]
; ASM-NEXT:  	.vbyte	{{[0-9]+}}, .hidden_foo[PR]              # @hidden_foo
; ASM-NEXT:  	.vbyte	{{[0-9]+}}, TOC[TC0]
; ASM-NEXT:  	.vbyte	{{[0-9]+}}, 0
; ASM-NEXT:  	.csect .hidden_foo[PR]
; ASM-NEXT:  # %bb.0:                                # %entry
; ASM-NEXT:  	blr
; ASM:        .csect .bar[PR],5
; ASM-NEXT:  	.globl	bar[DS]                         # -- Begin function bar
; ASM-NEXT:  	.globl	.bar[PR]
; ASM-NEXT:  	.align	4
; ASM-NEXT:  	.csect bar[DS]
; ASM-NEXT:  	.vbyte	{{[0-9]+}}, .bar[PR]                     # @bar
; ASM-NEXT:  	.vbyte	{{[0-9]+}}, TOC[TC0]
; ASM-NEXT:  	.vbyte	{{[0-9]+}}, 0
; ASM-NEXT:  	.csect .bar[PR],5
; ASM-NEXT:  # %bb.0:                                # %entry
; ASM:        bl .foo[PR]
; ASM-NEXT:  	nop
; ASM-NEXT:  	bl .static_overalign_foo[PR]
; ASM-NEXT:  	nop
; ASM-NEXT:  	bl .alias_foo
; ASM-NEXT:  	nop
; ASM-NEXT:  	bl .extern_foo
; ASM-NEXT:  	nop
; ASM-NEXT:  	bl .hidden_foo[PR]
; ASM-NEXT:  	nop
; ASM:        .csect .static_overalign_foo[PR],6
; ASM-NEXT:  	.lglobl	static_overalign_foo[DS]                  # -- Begin function static_overalign_foo
; ASM-NEXT:  	.lglobl	.static_overalign_foo[PR]
; ASM-NEXT:  	.align	6
; ASM-NEXT:  	.csect static_overalign_foo[DS]
; ASM-NEXT:  	.vbyte	{{[0-9]+}}, .static_overalign_foo[PR]              # @static_overalign_foo
; ASM-NEXT:  	.vbyte	{{[0-9]+}}, TOC[TC0]
; ASM-NEXT:  	.vbyte	{{[0-9]+}}, 0
; ASM-NEXT:  	.csect .static_overalign_foo[PR],6
; ASM-NEXT:  # %bb.0:                                # %entry
; ASM-NEXT:  	blr
; ASM:        .extern	.extern_foo
; ASM-NEXT:  	.extern	extern_foo[DS]
; ASM-NEXT:  	.globl	alias_foo
; ASM-NEXT:  	.globl	.alias_foo