1; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff -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 -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 -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: [[#Index:]] 105; CHECKSYM-NEXT: Name: .text 106; CHECKSYM-NEXT: Value (RelocatableAddress): 0x0 107; CHECKSYM-NEXT: Section: .text 108; CHECKSYM-NEXT: Type: 0x0 109; CHECKSYM-NEXT: StorageClass: C_HIDEXT (0x6B) 110; CHECKSYM-NEXT: NumberOfAuxEntries: 1 111; CHECKSYM-NEXT: CSECT Auxiliary Entry { 112; CHECKSYM-NEXT: Index: [[#Index+1]] 113; CHECKSYM-NEXT: SectionLen: 136 114; CHECKSYM-NEXT: ParameterHashIndex: 0x0 115; CHECKSYM-NEXT: TypeChkSectNum: 0x0 116; CHECKSYM-NEXT: SymbolAlignmentLog2: 4 117; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1) 118; CHECKSYM-NEXT: StorageMappingClass: XMC_PR (0x0) 119; CHECKSYM-NEXT: StabInfoIndex: 0x0 120; CHECKSYM-NEXT: StabSectNum: 0x0 121; CHECKSYM-NEXT: } 122; CHECKSYM-NEXT: } 123; CHECKSYM-NEXT: Symbol { 124; CHECKSYM-NEXT: Index: [[#Index+2]] 125; CHECKSYM-NEXT: Name: .foo_weak 126; CHECKSYM-NEXT: Value (RelocatableAddress): 0x0 127; CHECKSYM-NEXT: Section: .text 128; CHECKSYM-NEXT: Type: 0x0 129; CHECKSYM-NEXT: StorageClass: C_WEAKEXT (0x6F) 130; CHECKSYM-NEXT: NumberOfAuxEntries: 1 131; CHECKSYM-NEXT: CSECT Auxiliary Entry { 132; CHECKSYM-NEXT: Index: [[#Index+3]] 133; CHECKSYM-NEXT: ContainingCsectSymbolIndex: [[#Index]] 134; CHECKSYM-NEXT: ParameterHashIndex: 0x0 135; CHECKSYM-NEXT: TypeChkSectNum: 0x0 136; CHECKSYM-NEXT: SymbolAlignmentLog2: 0 137; CHECKSYM-NEXT: SymbolType: XTY_LD (0x2) 138; CHECKSYM-NEXT: StorageMappingClass: XMC_PR (0x0) 139; CHECKSYM-NEXT: StabInfoIndex: 0x0 140; CHECKSYM-NEXT: StabSectNum: 0x0 141; CHECKSYM-NEXT: } 142; CHECKSYM-NEXT: } 143; CHECKSYM-NEXT: Symbol { 144; CHECKSYM-NEXT: Index: [[#Index+4]] 145; CHECKSYM-NEXT: Name: .foo_ref_weak 146; CHECKSYM-NEXT: Value (RelocatableAddress): 0x20 147; CHECKSYM-NEXT: Section: .text 148; CHECKSYM-NEXT: Type: 0x0 149; CHECKSYM-NEXT: StorageClass: C_WEAKEXT (0x6F) 150; CHECKSYM-NEXT: NumberOfAuxEntries: 1 151; CHECKSYM-NEXT: CSECT Auxiliary Entry { 152; CHECKSYM-NEXT: Index: [[#Index+5]] 153; CHECKSYM-NEXT: ContainingCsectSymbolIndex: [[#Index]] 154; CHECKSYM-NEXT: ParameterHashIndex: 0x0 155; CHECKSYM-NEXT: TypeChkSectNum: 0x0 156; CHECKSYM-NEXT: SymbolAlignmentLog2: 0 157; CHECKSYM-NEXT: SymbolType: XTY_LD (0x2) 158; CHECKSYM-NEXT: StorageMappingClass: XMC_PR (0x0) 159; CHECKSYM-NEXT: StabInfoIndex: 0x0 160; CHECKSYM-NEXT: StabSectNum: 0x0 161; CHECKSYM-NEXT: } 162; CHECKSYM-NEXT: } 163; CHECKSYM-NEXT: Symbol { 164; CHECKSYM-NEXT: Index: [[#Index+6]] 165; CHECKSYM-NEXT: Name: .main 166; CHECKSYM-NEXT: Value (RelocatableAddress): 0x30 167; CHECKSYM-NEXT: Section: .text 168; CHECKSYM-NEXT: Type: 0x0 169; CHECKSYM-NEXT: StorageClass: C_EXT (0x2) 170; CHECKSYM-NEXT: NumberOfAuxEntries: 1 171; CHECKSYM-NEXT: CSECT Auxiliary Entry { 172; CHECKSYM-NEXT: Index: [[#Index+7]] 173; CHECKSYM-NEXT: ContainingCsectSymbolIndex: [[#Index]] 174; CHECKSYM-NEXT: ParameterHashIndex: 0x0 175; CHECKSYM-NEXT: TypeChkSectNum: 0x0 176; CHECKSYM-NEXT: SymbolAlignmentLog2: 0 177; CHECKSYM-NEXT: SymbolType: XTY_LD (0x2) 178; CHECKSYM-NEXT: StorageMappingClass: XMC_PR (0x0) 179; CHECKSYM-NEXT: StabInfoIndex: 0x0 180; CHECKSYM-NEXT: StabSectNum: 0x0 181; CHECKSYM-NEXT: } 182; CHECKSYM-NEXT: } 183; CHECKSYM-NEXT: Symbol { 184; CHECKSYM-NEXT: Index: [[#Index+8]] 185; CHECKSYM-NEXT: Name: .data 186; CHECKSYM-NEXT: Value (RelocatableAddress): 0x88 187; CHECKSYM-NEXT: Section: .data 188; CHECKSYM-NEXT: Type: 0x0 189; CHECKSYM-NEXT: StorageClass: C_HIDEXT (0x6B) 190; CHECKSYM-NEXT: NumberOfAuxEntries: 1 191; CHECKSYM-NEXT: CSECT Auxiliary Entry { 192; CHECKSYM-NEXT: Index: [[#Index+9]] 193; CHECKSYM-NEXT: SectionLen: 8 194; CHECKSYM-NEXT: ParameterHashIndex: 0x0 195; CHECKSYM-NEXT: TypeChkSectNum: 0x0 196; CHECKSYM-NEXT: SymbolAlignmentLog2: 2 197; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1) 198; CHECKSYM-NEXT: StorageMappingClass: XMC_RW (0x5) 199; CHECKSYM-NEXT: StabInfoIndex: 0x0 200; CHECKSYM-NEXT: StabSectNum: 0x0 201; CHECKSYM-NEXT: } 202; CHECKSYM-NEXT: } 203; CHECKSYM-NEXT: Symbol { 204; CHECKSYM-NEXT: Index: [[#Index+10]] 205; CHECKSYM-NEXT: Name: foo_weak_p 206; CHECKSYM-NEXT: Value (RelocatableAddress): 0x88 207; CHECKSYM-NEXT: Section: .data 208; CHECKSYM-NEXT: Type: 0x0 209; CHECKSYM-NEXT: StorageClass: C_EXT (0x2) 210; CHECKSYM-NEXT: NumberOfAuxEntries: 1 211; CHECKSYM-NEXT: CSECT Auxiliary Entry { 212; CHECKSYM-NEXT: Index: [[#Index+11]] 213; CHECKSYM-NEXT: ContainingCsectSymbolIndex: [[#Index+8]] 214; CHECKSYM-NEXT: ParameterHashIndex: 0x0 215; CHECKSYM-NEXT: TypeChkSectNum: 0x0 216; CHECKSYM-NEXT: SymbolAlignmentLog2: 0 217; CHECKSYM-NEXT: SymbolType: XTY_LD (0x2) 218; CHECKSYM-NEXT: StorageMappingClass: XMC_RW (0x5) 219; CHECKSYM-NEXT: StabInfoIndex: 0x0 220; CHECKSYM-NEXT: StabSectNum: 0x0 221; CHECKSYM-NEXT: } 222; CHECKSYM-NEXT: } 223; CHECKSYM-NEXT: Symbol { 224; CHECKSYM-NEXT: Index: [[#Index+12]] 225; CHECKSYM-NEXT: Name: b 226; CHECKSYM-NEXT: Value (RelocatableAddress): 0x8C 227; CHECKSYM-NEXT: Section: .data 228; CHECKSYM-NEXT: Type: 0x0 229; CHECKSYM-NEXT: StorageClass: C_WEAKEXT (0x6F) 230; CHECKSYM-NEXT: NumberOfAuxEntries: 1 231; CHECKSYM-NEXT: CSECT Auxiliary Entry { 232; CHECKSYM-NEXT: Index: [[#Index+13]] 233; CHECKSYM-NEXT: ContainingCsectSymbolIndex: [[#Index+8]] 234; CHECKSYM-NEXT: ParameterHashIndex: 0x0 235; CHECKSYM-NEXT: TypeChkSectNum: 0x0 236; CHECKSYM-NEXT: SymbolAlignmentLog2: 0 237; CHECKSYM-NEXT: SymbolType: XTY_LD (0x2) 238; CHECKSYM-NEXT: StorageMappingClass: XMC_RW (0x5) 239; CHECKSYM-NEXT: StabInfoIndex: 0x0 240; CHECKSYM-NEXT: StabSectNum: 0x0 241; CHECKSYM-NEXT: } 242; CHECKSYM-NEXT: } 243; CHECKSYM-NEXT: Symbol { 244; CHECKSYM-NEXT: Index: [[#Index+14]] 245; CHECKSYM-NEXT: Name: foo_weak 246; CHECKSYM-NEXT: Value (RelocatableAddress): 0x90 247; CHECKSYM-NEXT: Section: .data 248; CHECKSYM-NEXT: Type: 0x0 249; CHECKSYM-NEXT: StorageClass: C_WEAKEXT (0x6F) 250; CHECKSYM-NEXT: NumberOfAuxEntries: 1 251; CHECKSYM-NEXT: CSECT Auxiliary Entry { 252; CHECKSYM-NEXT: Index: [[#Index+15]] 253; CHECKSYM-NEXT: SectionLen: 12 254; CHECKSYM-NEXT: ParameterHashIndex: 0x0 255; CHECKSYM-NEXT: TypeChkSectNum: 0x0 256; CHECKSYM-NEXT: SymbolAlignmentLog2: 2 257; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1) 258; CHECKSYM-NEXT: StorageMappingClass: XMC_DS (0xA) 259; CHECKSYM-NEXT: StabInfoIndex: 0x0 260; CHECKSYM-NEXT: StabSectNum: 0x0 261; CHECKSYM-NEXT: } 262; CHECKSYM-NEXT: } 263; CHECKSYM-NEXT: Symbol { 264; CHECKSYM-NEXT: Index: [[#Index+16]] 265; CHECKSYM-NEXT: Name: foo_ref_weak 266; CHECKSYM-NEXT: Value (RelocatableAddress): 0x9C 267; CHECKSYM-NEXT: Section: .data 268; CHECKSYM-NEXT: Type: 0x0 269; CHECKSYM-NEXT: StorageClass: C_WEAKEXT (0x6F) 270; CHECKSYM-NEXT: NumberOfAuxEntries: 1 271; CHECKSYM-NEXT: CSECT Auxiliary Entry { 272; CHECKSYM-NEXT: Index: [[#Index+17]] 273; CHECKSYM-NEXT: SectionLen: 12 274; CHECKSYM-NEXT: ParameterHashIndex: 0x0 275; CHECKSYM-NEXT: TypeChkSectNum: 0x0 276; CHECKSYM-NEXT: SymbolAlignmentLog2: 2 277; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1) 278; CHECKSYM-NEXT: StorageMappingClass: XMC_DS (0xA) 279; CHECKSYM-NEXT: StabInfoIndex: 0x0 280; CHECKSYM-NEXT: StabSectNum: 0x0 281; CHECKSYM-NEXT: } 282; CHECKSYM-NEXT: } 283; CHECKSYM-NEXT: Symbol { 284; CHECKSYM-NEXT: Index: [[#Index+18]] 285; CHECKSYM-NEXT: Name: main 286; CHECKSYM-NEXT: Value (RelocatableAddress): 0xA8 287; CHECKSYM-NEXT: Section: .data 288; CHECKSYM-NEXT: Type: 0x0 289; CHECKSYM-NEXT: StorageClass: C_EXT (0x2) 290; CHECKSYM-NEXT: NumberOfAuxEntries: 1 291; CHECKSYM-NEXT: CSECT Auxiliary Entry { 292; CHECKSYM-NEXT: Index: [[#Index+19]] 293; CHECKSYM-NEXT: SectionLen: 12 294; CHECKSYM-NEXT: ParameterHashIndex: 0x0 295; CHECKSYM-NEXT: TypeChkSectNum: 0x0 296; CHECKSYM-NEXT: SymbolAlignmentLog2: 2 297; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1) 298; CHECKSYM-NEXT: StorageMappingClass: XMC_DS (0xA) 299; CHECKSYM-NEXT: StabInfoIndex: 0x0 300; CHECKSYM-NEXT: StabSectNum: 0x0 301; CHECKSYM-NEXT: } 302; CHECKSYM-NEXT: } 303; CHECKSYM-NEXT: Symbol { 304; CHECKSYM-NEXT: Index: [[#Index+20]] 305; CHECKSYM-NEXT: Name: TOC 306; CHECKSYM-NEXT: Value (RelocatableAddress): 0xB4 307; CHECKSYM-NEXT: Section: .data 308; CHECKSYM-NEXT: Type: 0x0 309; CHECKSYM-NEXT: StorageClass: C_HIDEXT (0x6B) 310; CHECKSYM-NEXT: NumberOfAuxEntries: 1 311; CHECKSYM-NEXT: CSECT Auxiliary Entry { 312; CHECKSYM-NEXT: Index: [[#Index+21]] 313; CHECKSYM-NEXT: SectionLen: 0 314; CHECKSYM-NEXT: ParameterHashIndex: 0x0 315; CHECKSYM-NEXT: TypeChkSectNum: 0x0 316; CHECKSYM-NEXT: SymbolAlignmentLog2: 2 317; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1) 318; CHECKSYM-NEXT: StorageMappingClass: XMC_TC0 (0xF) 319; CHECKSYM-NEXT: StabInfoIndex: 0x0 320; CHECKSYM-NEXT: StabSectNum: 0x0 321; CHECKSYM-NEXT: } 322; CHECKSYM-NEXT: } 323; CHECKSYM-NEXT: Symbol { 324; CHECKSYM-NEXT: Index: [[#Index+22]] 325; CHECKSYM-NEXT: Name: foo_weak_p 326; CHECKSYM-NEXT: Value (RelocatableAddress): 0xB4 327; CHECKSYM-NEXT: Section: .data 328; CHECKSYM-NEXT: Type: 0x0 329; CHECKSYM-NEXT: StorageClass: C_HIDEXT (0x6B) 330; CHECKSYM-NEXT: NumberOfAuxEntries: 1 331; CHECKSYM-NEXT: CSECT Auxiliary Entry { 332; CHECKSYM-NEXT: Index: [[#Index+23]] 333; CHECKSYM-NEXT: SectionLen: 4 334; CHECKSYM-NEXT: ParameterHashIndex: 0x0 335; CHECKSYM-NEXT: TypeChkSectNum: 0x0 336; CHECKSYM-NEXT: SymbolAlignmentLog2: 2 337; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1) 338; CHECKSYM-NEXT: StorageMappingClass: XMC_TC (0x3) 339; CHECKSYM-NEXT: StabInfoIndex: 0x0 340; CHECKSYM-NEXT: StabSectNum: 0x0 341; CHECKSYM-NEXT: } 342; CHECKSYM-NEXT: } 343; CHECKSYM-NEXT: Symbol { 344; CHECKSYM-NEXT: Index: [[#Index+24]] 345; CHECKSYM-NEXT: Name: b 346; CHECKSYM-NEXT: Value (RelocatableAddress): 0xB8 347; CHECKSYM-NEXT: Section: .data 348; CHECKSYM-NEXT: Type: 0x0 349; CHECKSYM-NEXT: StorageClass: C_HIDEXT (0x6B) 350; CHECKSYM-NEXT: NumberOfAuxEntries: 1 351; CHECKSYM-NEXT: CSECT Auxiliary Entry { 352; CHECKSYM-NEXT: Index: [[#Index+25]] 353; CHECKSYM-NEXT: SectionLen: 4 354; CHECKSYM-NEXT: ParameterHashIndex: 0x0 355; CHECKSYM-NEXT: TypeChkSectNum: 0x0 356; CHECKSYM-NEXT: SymbolAlignmentLog2: 2 357; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1) 358; CHECKSYM-NEXT: StorageMappingClass: XMC_TC (0x3) 359; CHECKSYM-NEXT: StabInfoIndex: 0x0 360; CHECKSYM-NEXT: StabSectNum: 0x0 361; CHECKSYM-NEXT: } 362; CHECKSYM-NEXT: } 363; CHECKSYM-NEXT: ] 364