1; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff -xcoff-traceback-table=false -mcpu=pwr4 \ 2; RUN: -mattr=-altivec -data-sections=false < %s | FileCheck --check-prefixes=COMMON,BIT32 %s 3 4; RUN: llc -verify-machineinstrs -mtriple powerpc64-ibm-aix-xcoff -xcoff-traceback-table=false -mcpu=pwr4 \ 5; RUN: -mattr=-altivec -data-sections=false < %s | FileCheck --check-prefixes=COMMON,BIT64 %s 6 7; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff -xcoff-traceback-table=false -mcpu=pwr4 \ 8; RUN: -mattr=-altivec -data-sections=false -filetype=obj -o %t.o < %s 9; RUN: llvm-readobj --symbols %t.o | FileCheck --check-prefix=CHECKSYM %s 10 11; RUN: not --crash llc -verify-machineinstrs -mcpu=pwr4 -mtriple powerpc64-ibm-aix-xcoff \ 12; RUN: -mattr=-altivec -data-sections=false -filetype=obj -o %t.o 2>&1 < %s | \ 13; RUN: FileCheck --check-prefix=XCOFF64 %s 14; XCOFF64: LLVM ERROR: 64-bit XCOFF object files are not supported yet. 15 16@foo_weak_p = global void (...)* bitcast (void ()* @foo_ref_weak to void (...)*), align 4 17@b = weak global i32 0, align 4 18 19define weak void @foo_weak(i32* %p) { 20entry: 21 %p.addr = alloca i32*, align 4 22 store i32* %p, i32** %p.addr, align 4 23 %0 = load i32*, i32** %p.addr, align 4 24 %1 = load i32, i32* %0, align 4 25 %inc = add nsw i32 %1, 1 26 store i32 %inc, i32* %0, align 4 27 ret void 28} 29 30define weak void @foo_ref_weak() { 31entry: 32 ret void 33} 34 35define i32 @main() { 36entry: 37 %0 = load void (...)*, void (...)** @foo_weak_p, align 4 38 %callee.knr.cast = bitcast void (...)* %0 to void ()* 39 call void %callee.knr.cast() 40 call void @foo_weak(i32* @b) 41 call void @foo_ref_weak() 42 ret i32 0 43} 44 45; COMMON: .weak foo_weak[DS] # -- Begin function foo_weak 46; COMMON-NEXT: .weak .foo_weak 47; COMMON-NEXT: .align 4 48; COMMON-NEXT: .csect foo_weak[DS] 49; BIT32-NEXT: .vbyte 4, .foo_weak # @foo_weak 50; BIT32-NEXT: .vbyte 4, TOC[TC0] 51; BIT32-NEXT: .vbyte 4, 0 52; BIT64-NEXT: .vbyte 8, .foo_weak # @foo_weak 53; BIT64-NEXT: .vbyte 8, TOC[TC0] 54; BIT64-NEXT: .vbyte 8, 0 55; COMMON-NEXT: .csect .text[PR] 56; COMMON-NEXT: .foo_weak: 57 58; COMMON: .weak foo_ref_weak[DS] # -- Begin function foo_ref_weak 59; COMMON-NEXT: .weak .foo_ref_weak 60; COMMON-NEXT: .align 4 61; COMMON-NEXT: .csect foo_ref_weak[DS] 62; BIT32-NEXT: .vbyte 4, .foo_ref_weak # @foo_ref_weak 63; BIT32-NEXT: .vbyte 4, TOC[TC0] 64; BIT32-NEXT: .vbyte 4, 0 65; BIT64-NEXT: .vbyte 8, .foo_ref_weak # @foo_ref_weak 66; BIT64-NEXT: .vbyte 8, TOC[TC0] 67; BIT64-NEXT: .vbyte 8, 0 68; COMMON-NEXT: .csect .text[PR] 69; COMMON-NEXT: .foo_ref_weak: 70 71; COMMON: .globl main[DS] # -- Begin function main 72; COMMON-NEXT: .globl .main 73; COMMON-NEXT: .align 4 74; COMMON-NEXT: .csect main[DS] 75; BIT32-NEXT: .vbyte 4, .main # @main 76; BIT32-NEXT: .vbyte 4, TOC[TC0] 77; BIT32-NEXT: .vbyte 4, 0 78; BIT64-NEXT: .vbyte 8, .main # @main 79; BIT64-NEXT: .vbyte 8, TOC[TC0] 80; BIT64-NEXT: .vbyte 8, 0 81; COMMON-NEXT: .csect .text[PR] 82; COMMON-NEXT: .main: 83 84; COMMON: .csect .data[RW] 85; COMMON-NEXT: .globl foo_weak_p 86; BIT32-NEXT: .align 2 87; BIT64-NEXT: .align 3 88; COMMON-NEXT: foo_weak_p: 89; BIT32-NEXT: .vbyte 4, foo_ref_weak[DS] 90; BIT64-NEXT: .vbyte 8, foo_ref_weak[DS] 91; COMMON-NEXT: .weak b 92; COMMON-NEXT: .align 2 93; COMMON-NEXT: b: 94; COMMON-NEXT: .vbyte 4, 0 # 0x0 95; COMMON-NEXT: .toc 96; COMMON-NEXT: L..C0: 97; COMMON-NEXT: .tc foo_weak_p[TC],foo_weak_p 98; COMMON-NEXT: L..C1: 99; COMMON-NEXT: .tc b[TC],b 100 101 102; CHECKSYM: Symbols [ 103; CHECKSYM-NEXT: Symbol { 104; CHECKSYM-NEXT: Index: 0 105; CHECKSYM-NEXT: Name: .file 106; CHECKSYM-NEXT: Value (SymbolTableIndex): 0x0 107; CHECKSYM-NEXT: Section: N_DEBUG 108; CHECKSYM-NEXT: Source Language ID: TB_C (0x0) 109; CHECKSYM-NEXT: CPU Version ID: 0x0 110; CHECKSYM-NEXT: StorageClass: C_FILE (0x67) 111; CHECKSYM-NEXT: NumberOfAuxEntries: 0 112; CHECKSYM-NEXT: } 113; CHECKSYM-NEXT: Symbol { 114; CHECKSYM-NEXT: Index: [[#Index:]] 115; CHECKSYM-NEXT: Name: .text 116; CHECKSYM-NEXT: Value (RelocatableAddress): 0x0 117; CHECKSYM-NEXT: Section: .text 118; CHECKSYM-NEXT: Type: 0x0 119; CHECKSYM-NEXT: StorageClass: C_HIDEXT (0x6B) 120; CHECKSYM-NEXT: NumberOfAuxEntries: 1 121; CHECKSYM-NEXT: CSECT Auxiliary Entry { 122; CHECKSYM-NEXT: Index: [[#Index+1]] 123; CHECKSYM-NEXT: SectionLen: 136 124; CHECKSYM-NEXT: ParameterHashIndex: 0x0 125; CHECKSYM-NEXT: TypeChkSectNum: 0x0 126; CHECKSYM-NEXT: SymbolAlignmentLog2: 4 127; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1) 128; CHECKSYM-NEXT: StorageMappingClass: XMC_PR (0x0) 129; CHECKSYM-NEXT: StabInfoIndex: 0x0 130; CHECKSYM-NEXT: StabSectNum: 0x0 131; CHECKSYM-NEXT: } 132; CHECKSYM-NEXT: } 133; CHECKSYM-NEXT: Symbol { 134; CHECKSYM-NEXT: Index: [[#Index+2]] 135; CHECKSYM-NEXT: Name: .foo_weak 136; CHECKSYM-NEXT: Value (RelocatableAddress): 0x0 137; CHECKSYM-NEXT: Section: .text 138; CHECKSYM-NEXT: Type: 0x0 139; CHECKSYM-NEXT: StorageClass: C_WEAKEXT (0x6F) 140; CHECKSYM-NEXT: NumberOfAuxEntries: 1 141; CHECKSYM-NEXT: CSECT Auxiliary Entry { 142; CHECKSYM-NEXT: Index: [[#Index+3]] 143; CHECKSYM-NEXT: ContainingCsectSymbolIndex: [[#Index]] 144; CHECKSYM-NEXT: ParameterHashIndex: 0x0 145; CHECKSYM-NEXT: TypeChkSectNum: 0x0 146; CHECKSYM-NEXT: SymbolAlignmentLog2: 0 147; CHECKSYM-NEXT: SymbolType: XTY_LD (0x2) 148; CHECKSYM-NEXT: StorageMappingClass: XMC_PR (0x0) 149; CHECKSYM-NEXT: StabInfoIndex: 0x0 150; CHECKSYM-NEXT: StabSectNum: 0x0 151; CHECKSYM-NEXT: } 152; CHECKSYM-NEXT: } 153; CHECKSYM-NEXT: Symbol { 154; CHECKSYM-NEXT: Index: [[#Index+4]] 155; CHECKSYM-NEXT: Name: .foo_ref_weak 156; CHECKSYM-NEXT: Value (RelocatableAddress): 0x20 157; CHECKSYM-NEXT: Section: .text 158; CHECKSYM-NEXT: Type: 0x0 159; CHECKSYM-NEXT: StorageClass: C_WEAKEXT (0x6F) 160; CHECKSYM-NEXT: NumberOfAuxEntries: 1 161; CHECKSYM-NEXT: CSECT Auxiliary Entry { 162; CHECKSYM-NEXT: Index: [[#Index+5]] 163; CHECKSYM-NEXT: ContainingCsectSymbolIndex: [[#Index]] 164; CHECKSYM-NEXT: ParameterHashIndex: 0x0 165; CHECKSYM-NEXT: TypeChkSectNum: 0x0 166; CHECKSYM-NEXT: SymbolAlignmentLog2: 0 167; CHECKSYM-NEXT: SymbolType: XTY_LD (0x2) 168; CHECKSYM-NEXT: StorageMappingClass: XMC_PR (0x0) 169; CHECKSYM-NEXT: StabInfoIndex: 0x0 170; CHECKSYM-NEXT: StabSectNum: 0x0 171; CHECKSYM-NEXT: } 172; CHECKSYM-NEXT: } 173; CHECKSYM-NEXT: Symbol { 174; CHECKSYM-NEXT: Index: [[#Index+6]] 175; CHECKSYM-NEXT: Name: .main 176; CHECKSYM-NEXT: Value (RelocatableAddress): 0x30 177; CHECKSYM-NEXT: Section: .text 178; CHECKSYM-NEXT: Type: 0x0 179; CHECKSYM-NEXT: StorageClass: C_EXT (0x2) 180; CHECKSYM-NEXT: NumberOfAuxEntries: 1 181; CHECKSYM-NEXT: CSECT Auxiliary Entry { 182; CHECKSYM-NEXT: Index: [[#Index+7]] 183; CHECKSYM-NEXT: ContainingCsectSymbolIndex: [[#Index]] 184; CHECKSYM-NEXT: ParameterHashIndex: 0x0 185; CHECKSYM-NEXT: TypeChkSectNum: 0x0 186; CHECKSYM-NEXT: SymbolAlignmentLog2: 0 187; CHECKSYM-NEXT: SymbolType: XTY_LD (0x2) 188; CHECKSYM-NEXT: StorageMappingClass: XMC_PR (0x0) 189; CHECKSYM-NEXT: StabInfoIndex: 0x0 190; CHECKSYM-NEXT: StabSectNum: 0x0 191; CHECKSYM-NEXT: } 192; CHECKSYM-NEXT: } 193; CHECKSYM-NEXT: Symbol { 194; CHECKSYM-NEXT: Index: [[#Index+8]] 195; CHECKSYM-NEXT: Name: .data 196; CHECKSYM-NEXT: Value (RelocatableAddress): 0x88 197; CHECKSYM-NEXT: Section: .data 198; CHECKSYM-NEXT: Type: 0x0 199; CHECKSYM-NEXT: StorageClass: C_HIDEXT (0x6B) 200; CHECKSYM-NEXT: NumberOfAuxEntries: 1 201; CHECKSYM-NEXT: CSECT Auxiliary Entry { 202; CHECKSYM-NEXT: Index: [[#Index+9]] 203; CHECKSYM-NEXT: SectionLen: 8 204; CHECKSYM-NEXT: ParameterHashIndex: 0x0 205; CHECKSYM-NEXT: TypeChkSectNum: 0x0 206; CHECKSYM-NEXT: SymbolAlignmentLog2: 2 207; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1) 208; CHECKSYM-NEXT: StorageMappingClass: XMC_RW (0x5) 209; CHECKSYM-NEXT: StabInfoIndex: 0x0 210; CHECKSYM-NEXT: StabSectNum: 0x0 211; CHECKSYM-NEXT: } 212; CHECKSYM-NEXT: } 213; CHECKSYM-NEXT: Symbol { 214; CHECKSYM-NEXT: Index: [[#Index+10]] 215; CHECKSYM-NEXT: Name: foo_weak_p 216; CHECKSYM-NEXT: Value (RelocatableAddress): 0x88 217; CHECKSYM-NEXT: Section: .data 218; CHECKSYM-NEXT: Type: 0x0 219; CHECKSYM-NEXT: StorageClass: C_EXT (0x2) 220; CHECKSYM-NEXT: NumberOfAuxEntries: 1 221; CHECKSYM-NEXT: CSECT Auxiliary Entry { 222; CHECKSYM-NEXT: Index: [[#Index+11]] 223; CHECKSYM-NEXT: ContainingCsectSymbolIndex: [[#Index+8]] 224; CHECKSYM-NEXT: ParameterHashIndex: 0x0 225; CHECKSYM-NEXT: TypeChkSectNum: 0x0 226; CHECKSYM-NEXT: SymbolAlignmentLog2: 0 227; CHECKSYM-NEXT: SymbolType: XTY_LD (0x2) 228; CHECKSYM-NEXT: StorageMappingClass: XMC_RW (0x5) 229; CHECKSYM-NEXT: StabInfoIndex: 0x0 230; CHECKSYM-NEXT: StabSectNum: 0x0 231; CHECKSYM-NEXT: } 232; CHECKSYM-NEXT: } 233; CHECKSYM-NEXT: Symbol { 234; CHECKSYM-NEXT: Index: [[#Index+12]] 235; CHECKSYM-NEXT: Name: b 236; CHECKSYM-NEXT: Value (RelocatableAddress): 0x8C 237; CHECKSYM-NEXT: Section: .data 238; CHECKSYM-NEXT: Type: 0x0 239; CHECKSYM-NEXT: StorageClass: C_WEAKEXT (0x6F) 240; CHECKSYM-NEXT: NumberOfAuxEntries: 1 241; CHECKSYM-NEXT: CSECT Auxiliary Entry { 242; CHECKSYM-NEXT: Index: [[#Index+13]] 243; CHECKSYM-NEXT: ContainingCsectSymbolIndex: [[#Index+8]] 244; CHECKSYM-NEXT: ParameterHashIndex: 0x0 245; CHECKSYM-NEXT: TypeChkSectNum: 0x0 246; CHECKSYM-NEXT: SymbolAlignmentLog2: 0 247; CHECKSYM-NEXT: SymbolType: XTY_LD (0x2) 248; CHECKSYM-NEXT: StorageMappingClass: XMC_RW (0x5) 249; CHECKSYM-NEXT: StabInfoIndex: 0x0 250; CHECKSYM-NEXT: StabSectNum: 0x0 251; CHECKSYM-NEXT: } 252; CHECKSYM-NEXT: } 253; CHECKSYM-NEXT: Symbol { 254; CHECKSYM-NEXT: Index: [[#Index+14]] 255; CHECKSYM-NEXT: Name: foo_weak 256; CHECKSYM-NEXT: Value (RelocatableAddress): 0x90 257; CHECKSYM-NEXT: Section: .data 258; CHECKSYM-NEXT: Type: 0x0 259; CHECKSYM-NEXT: StorageClass: C_WEAKEXT (0x6F) 260; CHECKSYM-NEXT: NumberOfAuxEntries: 1 261; CHECKSYM-NEXT: CSECT Auxiliary Entry { 262; CHECKSYM-NEXT: Index: [[#Index+15]] 263; CHECKSYM-NEXT: SectionLen: 12 264; CHECKSYM-NEXT: ParameterHashIndex: 0x0 265; CHECKSYM-NEXT: TypeChkSectNum: 0x0 266; CHECKSYM-NEXT: SymbolAlignmentLog2: 2 267; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1) 268; CHECKSYM-NEXT: StorageMappingClass: XMC_DS (0xA) 269; CHECKSYM-NEXT: StabInfoIndex: 0x0 270; CHECKSYM-NEXT: StabSectNum: 0x0 271; CHECKSYM-NEXT: } 272; CHECKSYM-NEXT: } 273; CHECKSYM-NEXT: Symbol { 274; CHECKSYM-NEXT: Index: [[#Index+16]] 275; CHECKSYM-NEXT: Name: foo_ref_weak 276; CHECKSYM-NEXT: Value (RelocatableAddress): 0x9C 277; CHECKSYM-NEXT: Section: .data 278; CHECKSYM-NEXT: Type: 0x0 279; CHECKSYM-NEXT: StorageClass: C_WEAKEXT (0x6F) 280; CHECKSYM-NEXT: NumberOfAuxEntries: 1 281; CHECKSYM-NEXT: CSECT Auxiliary Entry { 282; CHECKSYM-NEXT: Index: [[#Index+17]] 283; CHECKSYM-NEXT: SectionLen: 12 284; CHECKSYM-NEXT: ParameterHashIndex: 0x0 285; CHECKSYM-NEXT: TypeChkSectNum: 0x0 286; CHECKSYM-NEXT: SymbolAlignmentLog2: 2 287; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1) 288; CHECKSYM-NEXT: StorageMappingClass: XMC_DS (0xA) 289; CHECKSYM-NEXT: StabInfoIndex: 0x0 290; CHECKSYM-NEXT: StabSectNum: 0x0 291; CHECKSYM-NEXT: } 292; CHECKSYM-NEXT: } 293; CHECKSYM-NEXT: Symbol { 294; CHECKSYM-NEXT: Index: [[#Index+18]] 295; CHECKSYM-NEXT: Name: main 296; CHECKSYM-NEXT: Value (RelocatableAddress): 0xA8 297; CHECKSYM-NEXT: Section: .data 298; CHECKSYM-NEXT: Type: 0x0 299; CHECKSYM-NEXT: StorageClass: C_EXT (0x2) 300; CHECKSYM-NEXT: NumberOfAuxEntries: 1 301; CHECKSYM-NEXT: CSECT Auxiliary Entry { 302; CHECKSYM-NEXT: Index: [[#Index+19]] 303; CHECKSYM-NEXT: SectionLen: 12 304; CHECKSYM-NEXT: ParameterHashIndex: 0x0 305; CHECKSYM-NEXT: TypeChkSectNum: 0x0 306; CHECKSYM-NEXT: SymbolAlignmentLog2: 2 307; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1) 308; CHECKSYM-NEXT: StorageMappingClass: XMC_DS (0xA) 309; CHECKSYM-NEXT: StabInfoIndex: 0x0 310; CHECKSYM-NEXT: StabSectNum: 0x0 311; CHECKSYM-NEXT: } 312; CHECKSYM-NEXT: } 313; CHECKSYM-NEXT: Symbol { 314; CHECKSYM-NEXT: Index: [[#Index+20]] 315; CHECKSYM-NEXT: Name: TOC 316; CHECKSYM-NEXT: Value (RelocatableAddress): 0xB4 317; CHECKSYM-NEXT: Section: .data 318; CHECKSYM-NEXT: Type: 0x0 319; CHECKSYM-NEXT: StorageClass: C_HIDEXT (0x6B) 320; CHECKSYM-NEXT: NumberOfAuxEntries: 1 321; CHECKSYM-NEXT: CSECT Auxiliary Entry { 322; CHECKSYM-NEXT: Index: [[#Index+21]] 323; CHECKSYM-NEXT: SectionLen: 0 324; CHECKSYM-NEXT: ParameterHashIndex: 0x0 325; CHECKSYM-NEXT: TypeChkSectNum: 0x0 326; CHECKSYM-NEXT: SymbolAlignmentLog2: 2 327; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1) 328; CHECKSYM-NEXT: StorageMappingClass: XMC_TC0 (0xF) 329; CHECKSYM-NEXT: StabInfoIndex: 0x0 330; CHECKSYM-NEXT: StabSectNum: 0x0 331; CHECKSYM-NEXT: } 332; CHECKSYM-NEXT: } 333; CHECKSYM-NEXT: Symbol { 334; CHECKSYM-NEXT: Index: [[#Index+22]] 335; CHECKSYM-NEXT: Name: foo_weak_p 336; CHECKSYM-NEXT: Value (RelocatableAddress): 0xB4 337; CHECKSYM-NEXT: Section: .data 338; CHECKSYM-NEXT: Type: 0x0 339; CHECKSYM-NEXT: StorageClass: C_HIDEXT (0x6B) 340; CHECKSYM-NEXT: NumberOfAuxEntries: 1 341; CHECKSYM-NEXT: CSECT Auxiliary Entry { 342; CHECKSYM-NEXT: Index: [[#Index+23]] 343; CHECKSYM-NEXT: SectionLen: 4 344; CHECKSYM-NEXT: ParameterHashIndex: 0x0 345; CHECKSYM-NEXT: TypeChkSectNum: 0x0 346; CHECKSYM-NEXT: SymbolAlignmentLog2: 2 347; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1) 348; CHECKSYM-NEXT: StorageMappingClass: XMC_TC (0x3) 349; CHECKSYM-NEXT: StabInfoIndex: 0x0 350; CHECKSYM-NEXT: StabSectNum: 0x0 351; CHECKSYM-NEXT: } 352; CHECKSYM-NEXT: } 353; CHECKSYM-NEXT: Symbol { 354; CHECKSYM-NEXT: Index: [[#Index+24]] 355; CHECKSYM-NEXT: Name: b 356; CHECKSYM-NEXT: Value (RelocatableAddress): 0xB8 357; CHECKSYM-NEXT: Section: .data 358; CHECKSYM-NEXT: Type: 0x0 359; CHECKSYM-NEXT: StorageClass: C_HIDEXT (0x6B) 360; CHECKSYM-NEXT: NumberOfAuxEntries: 1 361; CHECKSYM-NEXT: CSECT Auxiliary Entry { 362; CHECKSYM-NEXT: Index: [[#Index+25]] 363; CHECKSYM-NEXT: SectionLen: 4 364; CHECKSYM-NEXT: ParameterHashIndex: 0x0 365; CHECKSYM-NEXT: TypeChkSectNum: 0x0 366; CHECKSYM-NEXT: SymbolAlignmentLog2: 2 367; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1) 368; CHECKSYM-NEXT: StorageMappingClass: XMC_TC (0x3) 369; CHECKSYM-NEXT: StabInfoIndex: 0x0 370; CHECKSYM-NEXT: StabSectNum: 0x0 371; CHECKSYM-NEXT: } 372; CHECKSYM-NEXT: } 373; CHECKSYM-NEXT: ] 374