1; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff -mcpu=pwr4 \ 2; RUN: -mattr=-altivec -function-sections < %s | \ 3; RUN: FileCheck --check-prefix=ASM %s 4; RUN: llc -verify-machineinstrs -mtriple powerpc64-ibm-aix-xcoff -mcpu=pwr4 \ 5; RUN: -mattr=-altivec -function-sections < %s | \ 6; RUN: FileCheck --check-prefix=ASM %s 7 8; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff -mcpu=pwr4 \ 9; RUN: -mattr=-altivec -function-sections -xcoff-traceback-table=true \ 10; RUN: -filetype=obj -o %t32.o < %s 11; RUN: llvm-objdump --syms --reloc --symbol-description %t32.o | \ 12; RUN: FileCheck -D#NFA=2 --check-prefix=XCOFF32 %s 13; RUN: llvm-objdump -dr --symbol-description %t32.o | \ 14; RUN: FileCheck -D#NFA=2 --check-prefix=DIS32 %s 15 16; RUN: llc -verify-machineinstrs -mtriple powerpc64-ibm-aix-xcoff -mcpu=pwr4 \ 17; RUN: -mattr=-altivec -function-sections -xcoff-traceback-table=true \ 18; RUN: -filetype=obj -o %t64.o < %s 19; RUN: llvm-objdump --syms --reloc --symbol-description %t64.o | \ 20; RUN: FileCheck -D#NFA=2 --check-prefix=XCOFF64 %s 21; RUN: llvm-objdump -dr --symbol-description %t64.o | \ 22; RUN: FileCheck -D#NFA=2 --check-prefix=DIS64 %s 23 24@alias_foo = alias void (...), ptr @foo 25 26define void @foo() { 27entry: 28 ret void 29} 30 31define hidden void @hidden_foo() { 32entry: 33 ret void 34} 35 36define void @bar() { 37entry: 38 call void @foo() 39 call void @static_overalign_foo() 40 call void @alias_foo() 41 call void @extern_foo() 42 call void @hidden_foo() 43 ret void 44} 45 46declare void @extern_foo(...) 47 48define internal void @static_overalign_foo() align 64 { 49entry: 50 ret void 51} 52 53; ASM: .csect ..text..[PR],5 54; ASM-NEXT: .rename ..text..[PR],"" 55; ASM: .csect .foo[PR],5 56; ASM-NEXT: .globl foo[DS] # -- Begin function foo 57; ASM-NEXT: .globl .foo[PR] 58; ASM-NEXT: .align 4 59; ASM-NEXT: .csect foo[DS] 60; ASM-NEXT: alias_foo: # @foo 61; ASM-NEXT: .vbyte {{[0-9]+}}, .foo[PR] 62; ASM-NEXT: .vbyte {{[0-9]+}}, TOC[TC0] 63; ASM-NEXT: .vbyte {{[0-9]+}}, 0 64; ASM-NEXT: .csect .foo[PR],5 65; ASM-NEXT: .alias_foo: 66; ASM-NEXT: # %bb.0: # %entry 67; ASM-NEXT: blr 68; ASM: .csect .hidden_foo[PR],5 69; ASM-NEXT: .globl hidden_foo[DS],hidden # -- Begin function hidden_foo 70; ASM-NEXT: .globl .hidden_foo[PR],hidden 71; ASM-NEXT: .align 4 72; ASM-NEXT: .csect hidden_foo[DS] 73; ASM-NEXT: .vbyte {{[0-9]+}}, .hidden_foo[PR] # @hidden_foo 74; ASM-NEXT: .vbyte {{[0-9]+}}, TOC[TC0] 75; ASM-NEXT: .vbyte {{[0-9]+}}, 0 76; ASM-NEXT: .csect .hidden_foo[PR] 77; ASM-NEXT: # %bb.0: # %entry 78; ASM-NEXT: blr 79; ASM: .csect .bar[PR],5 80; ASM-NEXT: .globl bar[DS] # -- Begin function bar 81; ASM-NEXT: .globl .bar[PR] 82; ASM-NEXT: .align 4 83; ASM-NEXT: .csect bar[DS] 84; ASM-NEXT: .vbyte {{[0-9]+}}, .bar[PR] # @bar 85; ASM-NEXT: .vbyte {{[0-9]+}}, TOC[TC0] 86; ASM-NEXT: .vbyte {{[0-9]+}}, 0 87; ASM-NEXT: .csect .bar[PR],5 88; ASM-NEXT: # %bb.0: # %entry 89; ASM: bl .foo[PR] 90; ASM-NEXT: nop 91; ASM-NEXT: bl .static_overalign_foo[PR] 92; ASM-NEXT: nop 93; ASM-NEXT: bl .alias_foo 94; ASM-NEXT: nop 95; ASM-NEXT: bl .extern_foo 96; ASM-NEXT: nop 97; ASM-NEXT: bl .hidden_foo[PR] 98; ASM-NEXT: nop 99; ASM: .csect .static_overalign_foo[PR],6 100; ASM-NEXT: .lglobl static_overalign_foo[DS] # -- Begin function static_overalign_foo 101; ASM-NEXT: .lglobl .static_overalign_foo[PR] 102; ASM-NEXT: .align 6 103; ASM-NEXT: .csect static_overalign_foo[DS] 104; ASM-NEXT: .vbyte {{[0-9]+}}, .static_overalign_foo[PR] # @static_overalign_foo 105; ASM-NEXT: .vbyte {{[0-9]+}}, TOC[TC0] 106; ASM-NEXT: .vbyte {{[0-9]+}}, 0 107; ASM-NEXT: .csect .static_overalign_foo[PR],6 108; ASM-NEXT: # %bb.0: # %entry 109; ASM-NEXT: blr 110; ASM: .extern .extern_foo 111; ASM-NEXT: .extern extern_foo[DS] 112; ASM-NEXT: .globl alias_foo 113; ASM-NEXT: .globl .alias_foo 114 115; XCOFF32: SYMBOL TABLE: 116; XCOFF32-NEXT: 00000000 df *DEBUG* 00000000 (idx: 0) .file 117; XCOFF32-NEXT: 00000000 *UND* 00000000 (idx: [[#NFA+1]]) .extern_foo[PR] 118; XCOFF32-NEXT: 00000000 *UND* 00000000 (idx: [[#NFA+3]]) extern_foo[DS] 119; XCOFF32-NEXT: 00000000 l .text 00000000 (idx: [[#NFA+5]]) [PR] 120; XCOFF32-NEXT: 00000000 g .text 00000019 (idx: [[#NFA+7]]) .foo[PR] 121; XCOFF32-NEXT: 00000000 g F .text (csect: (idx: [[#NFA+7]]) .foo[PR]) 00000000 (idx: [[#NFA+9]]) .alias_foo 122; XCOFF32-NEXT: 00000020 g F .text 00000020 .hidden (idx: [[#NFA+11]]) .hidden_foo[PR] 123; XCOFF32-NEXT: 00000040 g F .text 00000059 (idx: [[#NFA+13]]) .bar[PR] 124; XCOFF32-NEXT: 000000c0 l F .text 0000002a (idx: [[#NFA+15]]) .static_overalign_foo[PR] 125; XCOFF32-NEXT: 000000ec g O .data 0000000c (idx: [[#NFA+17]]) foo[DS] 126; XCOFF32-NEXT: 000000ec g O .data (csect: (idx: [[#NFA+17]]) foo[DS]) 00000000 (idx: [[#NFA+19]]) alias_foo 127; XCOFF32-NEXT: 000000f8 g O .data 0000000c .hidden (idx: [[#NFA+21]]) hidden_foo[DS] 128; XCOFF32-NEXT: 00000104 g O .data 0000000c (idx: [[#NFA+23]]) bar[DS] 129; XCOFF32-NEXT: 00000110 l O .data 0000000c (idx: [[#NFA+25]]) static_overalign_foo[DS] 130; XCOFF32-NEXT: 0000011c l .data 00000000 (idx: [[#NFA+27]]) TOC[TC0] 131 132; XCOFF32: RELOCATION RECORDS FOR [.text]: 133; XCOFF32-NEXT: OFFSET TYPE VALUE 134; XCOFF32-NEXT: 0000004c R_RBR (idx: [[#NFA+7]]) .foo[PR] 135; XCOFF32-NEXT: 00000054 R_RBR (idx: [[#NFA+15]]) .static_overalign_foo[PR] 136; XCOFF32-NEXT: 0000005c R_RBR (idx: [[#NFA+9]]) .alias_foo 137; XCOFF32-NEXT: 00000064 R_RBR (idx: [[#NFA+1]]) .extern_foo[PR] 138; XCOFF32-NEXT: 0000006c R_RBR (idx: [[#NFA+11]]) .hidden_foo[PR] 139; XCOFF32: RELOCATION RECORDS FOR [.data]: 140; XCOFF32-NEXT: OFFSET TYPE VALUE 141; XCOFF32-NEXT: 00000000 R_POS (idx: [[#NFA+7]]) .foo[PR] 142; XCOFF32-NEXT: 00000004 R_POS (idx: [[#NFA+27]]) TOC[TC0] 143; XCOFF32-NEXT: 0000000c R_POS (idx: [[#NFA+11]]) .hidden_foo[PR] 144; XCOFF32-NEXT: 00000010 R_POS (idx: [[#NFA+27]]) TOC[TC0] 145; XCOFF32-NEXT: 00000018 R_POS (idx: [[#NFA+13]]) .bar[PR] 146; XCOFF32-NEXT: 0000001c R_POS (idx: [[#NFA+27]]) TOC[TC0] 147; XCOFF32-NEXT: 00000024 R_POS (idx: [[#NFA+15]]) .static_overalign_foo[PR] 148; XCOFF32-NEXT: 00000028 R_POS (idx: [[#NFA+27]]) TOC[TC0] 149 150; XCOFF64: SYMBOL TABLE: 151; XCOFF64-NEXT: 0000000000000000 df *DEBUG* 0000000000000000 (idx: 0) .file 152; XCOFF64-NEXT: 0000000000000000 *UND* 0000000000000000 (idx: [[#NFA+1]]) .extern_foo[PR] 153; XCOFF64-NEXT: 0000000000000000 *UND* 0000000000000000 (idx: [[#NFA+3]]) extern_foo[DS] 154; XCOFF64-NEXT: 0000000000000000 l .text 0000000000000000 (idx: [[#NFA+5]]) [PR] 155; XCOFF64-NEXT: 0000000000000000 g .text 0000000000000019 (idx: [[#NFA+7]]) .foo[PR] 156; XCOFF64-NEXT: 0000000000000000 g F .text (csect: (idx: [[#NFA+7]]) .foo[PR]) 0000000000000000 (idx: [[#NFA+9]]) .alias_foo 157; XCOFF64-NEXT: 0000000000000020 g F .text 0000000000000020 .hidden (idx: [[#NFA+11]]) .hidden_foo[PR] 158; XCOFF64-NEXT: 0000000000000040 g F .text 0000000000000059 (idx: [[#NFA+13]]) .bar[PR] 159; XCOFF64-NEXT: 00000000000000c0 l F .text 000000000000002a (idx: [[#NFA+15]]) .static_overalign_foo[PR] 160; XCOFF64-NEXT: 00000000000000f0 g O .data 0000000000000018 (idx: [[#NFA+17]]) foo[DS] 161; XCOFF64-NEXT: 00000000000000f0 g O .data (csect: (idx: [[#NFA+17]]) foo[DS]) 0000000000000000 (idx: [[#NFA+19]]) alias_foo 162; XCOFF64-NEXT: 0000000000000108 g O .data 0000000000000018 .hidden (idx: [[#NFA+21]]) hidden_foo[DS] 163; XCOFF64-NEXT: 0000000000000120 g O .data 0000000000000018 (idx: [[#NFA+23]]) bar[DS] 164; XCOFF64-NEXT: 0000000000000138 l O .data 0000000000000018 (idx: [[#NFA+25]]) static_overalign_foo[DS] 165; XCOFF64-NEXT: 0000000000000150 l .data 0000000000000000 (idx: [[#NFA+27]]) TOC[TC0] 166 167; XCOFF64: RELOCATION RECORDS FOR [.text]: 168; XCOFF64-NEXT: OFFSET TYPE VALUE 169; XCOFF64-NEXT: 000000000000004c R_RBR (idx: [[#NFA+7]]) .foo[PR] 170; XCOFF64-NEXT: 0000000000000054 R_RBR (idx: [[#NFA+15]]) .static_overalign_foo[PR] 171; XCOFF64-NEXT: 000000000000005c R_RBR (idx: [[#NFA+9]]) .alias_foo 172; XCOFF64-NEXT: 0000000000000064 R_RBR (idx: [[#NFA+1]]) .extern_foo[PR] 173; XCOFF64-NEXT: 000000000000006c R_RBR (idx: [[#NFA+11]]) .hidden_foo[PR] 174; XCOFF64: RELOCATION RECORDS FOR [.data]: 175; XCOFF64-NEXT: OFFSET TYPE VALUE 176; XCOFF64-NEXT: 0000000000000000 R_POS (idx: [[#NFA+7]]) .foo[PR] 177; XCOFF64-NEXT: 0000000000000008 R_POS (idx: [[#NFA+27]]) TOC[TC0] 178; XCOFF64-NEXT: 0000000000000018 R_POS (idx: [[#NFA+11]]) .hidden_foo[PR] 179; XCOFF64-NEXT: 0000000000000020 R_POS (idx: [[#NFA+27]]) TOC[TC0] 180; XCOFF64-NEXT: 0000000000000030 R_POS (idx: [[#NFA+13]]) .bar[PR] 181; XCOFF64-NEXT: 0000000000000038 R_POS (idx: [[#NFA+27]]) TOC[TC0] 182; XCOFF64-NEXT: 0000000000000048 R_POS (idx: [[#NFA+15]]) .static_overalign_foo[PR] 183; XCOFF64-NEXT: 0000000000000050 R_POS (idx: [[#NFA+27]]) TOC[TC0] 184 185; DIS32: Disassembly of section .text: 186; DIS32: 00000000 (idx: [[#NFA+9]]) .alias_foo: 187; DIS32: 00000020 (idx: [[#NFA+11]]) .hidden_foo[PR]: 188; DIS32: 00000040 (idx: [[#NFA+13]]) .bar[PR]: 189; DIS32-NEXT: 40: 7c 08 02 a6 mflr 0 190; DIS32-NEXT: 44: 94 21 ff c0 stwu 1, -64(1) 191; DIS32-NEXT: 48: 90 01 00 48 stw 0, 72(1) 192; DIS32-NEXT: 4c: 4b ff ff b5 bl 0x0 <.foo> 193; DIS32-NEXT: 0000004c: R_RBR (idx: [[#NFA+7]]) .foo[PR] 194; DIS32-NEXT: 50: 60 00 00 00 nop 195; DIS32-NEXT: 54: 48 00 00 6d bl 0xc0 <.static_overalign_foo> 196; DIS32-NEXT: 00000054: R_RBR (idx: [[#NFA+15]]) .static_overalign_foo[PR] 197; DIS32-NEXT: 58: 60 00 00 00 nop 198; DIS32-NEXT: 5c: 4b ff ff a5 bl 0x0 <.alias_foo> 199; DIS32-NEXT: 0000005c: R_RBR (idx: [[#NFA+9]]) .alias_foo 200; DIS32-NEXT: 60: 60 00 00 00 nop 201; DIS32-NEXT: 64: 4b ff ff 9d bl 0x0 <.extern_foo> 202; DIS32-NEXT: 00000064: R_RBR (idx: [[#NFA+1]]) .extern_foo[PR] 203; DIS32-NEXT: 68: 60 00 00 00 nop 204; DIS32-NEXT: 6c: 4b ff ff b5 bl 0x20 <.hidden_foo> 205; DIS32-NEXT: 0000006c: R_RBR (idx: [[#NFA+11]]) .hidden_foo[PR] 206; DIS32: 000000c0 (idx: [[#NFA+15]]) .static_overalign_foo[PR]: 207 208; DIS64: Disassembly of section .text: 209; DIS64: 0000000000000000 (idx: [[#NFA+9]]) .alias_foo: 210; DIS64: 0000000000000020 (idx: [[#NFA+11]]) .hidden_foo[PR]: 211; DIS64: 0000000000000040 (idx: [[#NFA+13]]) .bar[PR]: 212; DIS64-NEXT: 40: 7c 08 02 a6 mflr 0 213; DIS64-NEXT: 44: f8 21 ff 91 stdu 1, -112(1) 214; DIS64-NEXT: 48: f8 01 00 80 std 0, 128(1) 215; DIS64-NEXT: 4c: 4b ff ff b5 bl 0x0 <.foo> 216; DIS64-NEXT: 000000000000004c: R_RBR (idx: [[#NFA+7]]) .foo[PR] 217; DIS64-NEXT: 50: 60 00 00 00 nop 218; DIS64-NEXT: 54: 48 00 00 6d bl 0xc0 <.static_overalign_foo> 219; DIS64-NEXT: 0000000000000054: R_RBR (idx: [[#NFA+15]]) .static_overalign_foo[PR] 220; DIS64-NEXT: 58: 60 00 00 00 nop 221; DIS64-NEXT: 5c: 4b ff ff a5 bl 0x0 <.alias_foo> 222; DIS64-NEXT: 000000000000005c: R_RBR (idx: [[#NFA+9]]) .alias_foo 223; DIS64-NEXT: 60: 60 00 00 00 nop 224; DIS64-NEXT: 64: 4b ff ff 9d bl 0x0 <.extern_foo> 225; DIS64-NEXT: 0000000000000064: R_RBR (idx: [[#NFA+1]]) .extern_foo[PR] 226; DIS64-NEXT: 68: 60 00 00 00 nop 227; DIS64-NEXT: 6c: 4b ff ff b5 bl 0x20 <.hidden_foo> 228; DIS64-NEXT: 000000000000006c: R_RBR (idx: [[#NFA+11]]) .hidden_foo[PR] 229; DIS64: 00000000000000c0 (idx: [[#NFA+15]]) .static_overalign_foo[PR]: 230