1; RUN: llc -verify-machineinstrs -mcpu=pwr7 -mtriple=powerpc64-ibm-aix-xcoff \ 2; RUN: -xcoff-traceback-table=false -data-sections=false -filetype=obj -o %t.o < %s 3; RUN: llvm-readobj --relocs --expand-relocs %t.o | FileCheck -D#NFA=2 --check-prefix=REL64 %s 4; RUN: llvm-readobj --syms %t.o | FileCheck -D#NFA=2 --check-prefix=SYM64 %s 5; RUN: llvm-objdump -D -r --symbol-description %t.o | FileCheck -D#NFA=2 --check-prefix=DIS64 %s 6 7; RUN: llc -verify-machineinstrs -mcpu=pwr7 -mtriple=powerpc64-ibm-aix-xcoff -code-model=small \ 8; RUN: -xcoff-traceback-table=false -data-sections=false -filetype=obj -o %t.o < %s 9; RUN: llvm-readobj --relocs --expand-relocs %t.o | FileCheck -D#NFA=2 --check-prefix=REL64 %s 10; RUN: llvm-readobj --syms %t.o | FileCheck -D#NFA=2 --check-prefix=SYM64 %s 11; RUN: llvm-objdump -D -r --symbol-description %t.o | FileCheck -D#NFA=2 --check-prefix=DIS64 %s 12 13; RUN: llc -verify-machineinstrs -mcpu=pwr7 -mtriple=powerpc-ibm-aix-xcoff \ 14; RUN: -xcoff-traceback-table=false -data-sections=false -filetype=obj -o %t.o < %s 15; RUN: llvm-readobj --relocs --expand-relocs %t.o | FileCheck -D#NFA=2 --check-prefix=REL32 %s 16; RUN: llvm-readobj --syms %t.o | FileCheck -D#NFA=2 --check-prefix=SYM32 %s 17; RUN: llvm-objdump -D -r --symbol-description %t.o | FileCheck -D#NFA=2 --check-prefix=DIS32 %s 18 19; RUN: llc -verify-machineinstrs -mcpu=pwr7 -mtriple=powerpc-ibm-aix-xcoff -code-model=small \ 20; RUN: -xcoff-traceback-table=false -data-sections=false -filetype=obj -o %t.o < %s 21; RUN: llvm-readobj --relocs --expand-relocs %t.o | FileCheck -D#NFA=2 --check-prefix=REL32 %s 22; RUN: llvm-readobj --syms %t.o | FileCheck -D#NFA=2 --check-prefix=SYM32 %s 23; RUN: llvm-objdump -D -r --symbol-description %t.o | FileCheck -D#NFA=2 --check-prefix=DIS32 %s 24 25@global_int_nonzero = thread_local(initialexec) global i32 1, align 4 26@intern_int_zero = internal thread_local(initialexec) global i32 0, align 4 27 28define void @store_intern_int_zero(i32 noundef signext %i) { 29entry: 30 %addr = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @intern_int_zero) 31 store i32 %i, ptr %addr, align 4 32 ret void 33} 34 35define signext i32 @load_global_int_nonzero() { 36entry: 37 %addr = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @global_int_nonzero) 38 %val = load i32, ptr %addr, align 4 39 ret i32 %val 40} 41 42define signext i32 @load_intern_int_zero() { 43entry: 44 %addr = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @intern_int_zero) 45 %val = load i32, ptr %addr, align 4 46 ret i32 %val 47} 48 49declare nonnull ptr @llvm.threadlocal.address.p0(ptr nonnull) 50 51; REL64: File: 52; REL64-NEXT: Format: aix5coff64-rs6000 53; REL64-NEXT: Arch: powerpc64 54; REL64-NEXT: AddressSize: 64bit 55; REL64-NEXT: Relocations [ 56; REL64: Virtual Address: 0x2 57; REL64-NEXT: Symbol: intern_int_zero ([[#NFA+17]]) 58; REL64-NEXT: IsSigned: No 59; REL64-NEXT: FixupBitValue: 0 60; REL64-NEXT: Length: 16 61; REL64-NEXT: Type: R_TOC (0x3) 62; REL64-NEXT: } 63; REL64: Virtual Address: 0x12 64; REL64-NEXT: Symbol: global_int_nonzero ([[#NFA+19]]) 65; REL64-NEXT: IsSigned: No 66; REL64-NEXT: FixupBitValue: 0 67; REL64-NEXT: Length: 16 68; REL64-NEXT: Type: R_TOC (0x3) 69; REL64-NEXT: } 70; REL64: Virtual Address: 0x22 71; REL64-NEXT: Symbol: intern_int_zero ([[#NFA+17]]) 72; REL64-NEXT: IsSigned: No 73; REL64-NEXT: FixupBitValue: 0 74; REL64-NEXT: Length: 16 75; REL64-NEXT: Type: R_TOC (0x3) 76; REL64-NEXT: } 77; REL64: Virtual Address: 0x78 78; REL64-NEXT: Symbol: intern_int_zero ([[#NFA+25]]) 79; REL64-NEXT: IsSigned: No 80; REL64-NEXT: FixupBitValue: 0 81; REL64-NEXT: Length: 64 82; REL64-NEXT: Type: R_TLS_IE (0x21) 83; REL64-NEXT: } 84; REL64: Virtual Address: 0x80 85; REL64-NEXT: Symbol: global_int_nonzero ([[#NFA+23]]) 86; REL64-NEXT: IsSigned: No 87; REL64-NEXT: FixupBitValue: 0 88; REL64-NEXT: Length: 64 89; REL64-NEXT: Type: R_TLS_IE (0x21) 90; REL64-NEXT: } 91 92; SYM64: File: 93; SYM64-NEXT: Format: aix5coff64-rs6000 94; SYM64-NEXT: Arch: powerpc64 95; SYM64-NEXT: AddressSize: 64bit 96; SYM64-NEXT: Symbols [ 97; SYM64: Name: intern_int_zero 98; SYM64-NEXT: Value (RelocatableAddress): 0x78 99; SYM64-NEXT: Section: .data 100; SYM64-NEXT: Type: 0x0 101; SYM64-NEXT: StorageClass: C_HIDEXT (0x6B) 102; SYM64-NEXT: NumberOfAuxEntries: 1 103; SYM64-NEXT: CSECT Auxiliary Entry { 104; SYM64-NEXT: Index: [[#INDX:]] 105; SYM64-NEXT: SectionLen: 8 106; SYM64-NEXT: ParameterHashIndex: 0x0 107; SYM64-NEXT: TypeChkSectNum: 0x0 108; SYM64-NEXT: SymbolAlignmentLog2: 3 109; SYM64-NEXT: SymbolType: XTY_SD (0x1) 110; SYM64-NEXT: StorageMappingClass: XMC_TC (0x3) 111; SYM64-NEXT: Auxiliary Type: AUX_CSECT (0xFB) 112; SYM64-NEXT: } 113; SYM64-NEXT: } 114; SYM64: Index: [[#INDX+1]] 115; SYM64-NEXT: Name: global_int_nonzero 116; SYM64-NEXT: Value (RelocatableAddress): 0x80 117; SYM64-NEXT: Section: .data 118; SYM64-NEXT: Type: 0x0 119; SYM64-NEXT: StorageClass: C_HIDEXT (0x6B) 120; SYM64-NEXT: NumberOfAuxEntries: 1 121; SYM64-NEXT: CSECT Auxiliary Entry { 122; SYM64-NEXT: Index: [[#INDX+2]] 123; SYM64-NEXT: SectionLen: 8 124; SYM64-NEXT: ParameterHashIndex: 0x0 125; SYM64-NEXT: TypeChkSectNum: 0x0 126; SYM64-NEXT: SymbolAlignmentLog2: 3 127; SYM64-NEXT: SymbolType: XTY_SD (0x1) 128; SYM64-NEXT: StorageMappingClass: XMC_TC (0x3) 129; SYM64-NEXT: Auxiliary Type: AUX_CSECT (0xFB) 130; SYM64-NEXT: } 131; SYM64-NEXT: } 132; SYM64: Index: [[#INDX+5]] 133; SYM64-NEXT: Name: global_int_nonzero 134; SYM64-NEXT: Value (RelocatableAddress): 0x0 135; SYM64-NEXT: Section: .tdata 136; SYM64-NEXT: Type: 0x0 137; SYM64-NEXT: StorageClass: C_EXT (0x2) 138; SYM64-NEXT: NumberOfAuxEntries: 1 139; SYM64-NEXT: CSECT Auxiliary Entry { 140; SYM64-NEXT: Index: [[#INDX+6]] 141; SYM64-NEXT: ContainingCsectSymbolIndex: [[#INDX+3]] 142; SYM64-NEXT: ParameterHashIndex: 0x0 143; SYM64-NEXT: TypeChkSectNum: 0x0 144; SYM64-NEXT: SymbolAlignmentLog2: 0 145; SYM64-NEXT: SymbolType: XTY_LD (0x2) 146; SYM64-NEXT: StorageMappingClass: XMC_TL (0x14) 147; SYM64-NEXT: Auxiliary Type: AUX_CSECT (0xFB) 148; SYM64-NEXT: } 149; SYM64-NEXT: } 150; SYM64: Index: [[#INDX+7]] 151; SYM64-NEXT: Name: intern_int_zero 152; SYM64-NEXT: Value (RelocatableAddress): 0x4 153; SYM64-NEXT: Section: .tbss 154; SYM64-NEXT: Type: 0x0 155; SYM64-NEXT: StorageClass: C_HIDEXT (0x6B) 156; SYM64-NEXT: NumberOfAuxEntries: 1 157; SYM64-NEXT: CSECT Auxiliary Entry { 158; SYM64-NEXT: Index: [[#INDX+8]] 159; SYM64-NEXT: SectionLen: 4 160; SYM64-NEXT: ParameterHashIndex: 0x0 161; SYM64-NEXT: TypeChkSectNum: 0x0 162; SYM64-NEXT: SymbolAlignmentLog2: 2 163; SYM64-NEXT: SymbolType: XTY_CM (0x3) 164; SYM64-NEXT: StorageMappingClass: XMC_UL (0x15) 165; SYM64-NEXT: Auxiliary Type: AUX_CSECT (0xFB) 166; SYM64-NEXT: } 167; SYM64-NEXT: } 168 169; DIS64: {{.*}}: file format aix5coff64-rs6000 170; DIS64: Disassembly of section .text: 171; DIS64: (idx: [[#NFA+3]]) .store_intern_int_zero: 172; DIS64-NEXT: ld 4, 0(2) 173; DIS64-NEXT: (idx: [[#NFA+17]]) intern_int_zero[TC] 174; DIS64-NEXT: stwx 3, 13, 4 175; DIS64-NEXT: blr 176; DIS64: (idx: [[#NFA+5]]) .load_global_int_nonzero: 177; DIS64-NEXT: ld 3, 8(2) 178; DIS64-NEXT: (idx: [[#NFA+19]]) global_int_nonzero[TC] 179; DIS64-NEXT: lwax 3, 13, 3 180; DIS64-NEXT: blr 181; DIS64: (idx: [[#NFA+7]]) .load_intern_int_zero: 182; DIS64-NEXT: ld 3, 0(2) 183; DIS64-NEXT: (idx: [[#NFA+17]]) intern_int_zero[TC] 184; DIS64-NEXT: lwax 3, 13, 3 185; DIS64-NEXT: blr 186 187; DIS64: Disassembly of section .data: 188; DIS64: (idx: [[#NFA+9]]) store_intern_int_zero[DS]: 189; DIS64: R_POS (idx: [[#NFA+3]]) .store_intern_int_zero 190; DIS64: R_POS (idx: [[#NFA+15]]) TOC[TC0] 191; DIS64: (idx: [[#NFA+11]]) load_global_int_nonzero[DS]: 192; DIS64: R_POS (idx: [[#NFA+5]]) .load_global_int_nonzero 193; DIS64: R_POS (idx: [[#NFA+15]]) TOC[TC0] 194; DIS64: (idx: [[#NFA+13]]) load_intern_int_zero[DS]: 195; DIS64: R_POS (idx: [[#NFA+7]]) .load_intern_int_zero 196; DIS64: R_POS (idx: [[#NFA+15]]) TOC[TC0] 197; DIS64: (idx: [[#NFA+17]]) intern_int_zero[TC]: 198; DIS64: R_TLS_IE (idx: [[#NFA+25]]) intern_int_zero[UL] 199; DIS64: (idx: [[#NFA+19]]) global_int_nonzero[TC]: 200; DIS64: R_TLS_IE (idx: [[#NFA+23]]) global_int_nonzero 201 202; DIS64: Disassembly of section .tdata: 203; DIS64: (idx: [[#NFA+23]]) global_int_nonzero: 204 205; DIS64: Disassembly of section .tbss: 206; DIS64: (idx: [[#NFA+25]]) intern_int_zero[UL]: 207 208; REL32: File: 209; REL32-NEXT: Format: aixcoff-rs6000 210; REL32-NEXT: Arch: powerpc 211; REL32-NEXT: AddressSize: 32bit 212; REL32-NEXT: Relocations [ 213; REL32: Virtual Address: 0xA 214; REL32-NEXT: Symbol: intern_int_zero ([[#NFA+19]]) 215; REL32-NEXT: IsSigned: No 216; REL32-NEXT: FixupBitValue: 0 217; REL32-NEXT: Length: 16 218; REL32-NEXT: Type: R_TOC (0x3) 219; REL32-NEXT: } 220; REL32: Virtual Address: 0x10 221; REL32-NEXT: Symbol: .__get_tpointer ([[#NFA+1]]) 222; REL32-NEXT: IsSigned: No 223; REL32-NEXT: FixupBitValue: 0 224; REL32-NEXT: Length: 26 225; REL32-NEXT: Type: R_RBA (0x18) 226; REL32-NEXT: } 227; REL32: Virtual Address: 0x3A 228; REL32-NEXT: Symbol: global_int_nonzero ([[#NFA+21]]) 229; REL32-NEXT: IsSigned: No 230; REL32-NEXT: FixupBitValue: 0 231; REL32-NEXT: Length: 16 232; REL32-NEXT: Type: R_TOC (0x3) 233; REL32-NEXT: } 234; REL32: Virtual Address: 0x40 235; REL32-NEXT: Symbol: .__get_tpointer ([[#NFA+1]]) 236; REL32-NEXT: IsSigned: No 237; REL32-NEXT: FixupBitValue: 0 238; REL32-NEXT: Length: 26 239; REL32-NEXT: Type: R_RBA (0x18) 240; REL32-NEXT: } 241; REL32: Virtual Address: 0x6A 242; REL32-NEXT: Symbol: intern_int_zero ([[#NFA+19]]) 243; REL32-NEXT: IsSigned: No 244; REL32-NEXT: FixupBitValue: 0 245; REL32-NEXT: Length: 16 246; REL32-NEXT: Type: R_TOC (0x3) 247; REL32-NEXT: } 248; REL32: Virtual Address: 0x70 249; REL32-NEXT: Symbol: .__get_tpointer ([[#NFA+1]]) 250; REL32-NEXT: IsSigned: No 251; REL32-NEXT: FixupBitValue: 0 252; REL32-NEXT: Length: 26 253; REL32-NEXT: Type: R_RBA (0x18) 254; REL32-NEXT: } 255; REL32: Virtual Address: 0xAC 256; REL32-NEXT: Symbol: intern_int_zero ([[#NFA+27]]) 257; REL32-NEXT: IsSigned: No 258; REL32-NEXT: FixupBitValue: 0 259; REL32-NEXT: Length: 32 260; REL32-NEXT: Type: R_TLS_IE (0x21) 261; REL32-NEXT: } 262; REL32: Virtual Address: 0xB0 263; REL32-NEXT: Symbol: global_int_nonzero ([[#NFA+25]]) 264; REL32-NEXT: IsSigned: No 265; REL32-NEXT: FixupBitValue: 0 266; REL32-NEXT: Length: 32 267; REL32-NEXT: Type: R_TLS_IE (0x21) 268; REL32-NEXT: } 269 270; SYM32: File: 271; SYM32-NEXT: Format: aixcoff-rs6000 272; SYM32-NEXT: Arch: powerpc 273; SYM32-NEXT: AddressSize: 32bit 274; SYM32-NEXT: Symbols [ 275; SYM32: Name: intern_int_zero 276; SYM32-NEXT: Value (RelocatableAddress): 0xAC 277; SYM32-NEXT: Section: .data 278; SYM32-NEXT: Type: 0x0 279; SYM32-NEXT: StorageClass: C_HIDEXT (0x6B) 280; SYM32-NEXT: NumberOfAuxEntries: 1 281; SYM32-NEXT: CSECT Auxiliary Entry { 282; SYM32-NEXT: Index: [[#INDX:]] 283; SYM32-NEXT: SectionLen: 4 284; SYM32-NEXT: ParameterHashIndex: 0x0 285; SYM32-NEXT: TypeChkSectNum: 0x0 286; SYM32-NEXT: SymbolAlignmentLog2: 2 287; SYM32-NEXT: SymbolType: XTY_SD (0x1) 288; SYM32-NEXT: StorageMappingClass: XMC_TC (0x3) 289; SYM32-NEXT: StabInfoIndex: 0x0 290; SYM32-NEXT: StabSectNum: 0x0 291; SYM32-NEXT: } 292; SYM32-NEXT: } 293; SYM32: Index: [[#INDX+1]] 294; SYM32-NEXT: Name: global_int_nonzero 295; SYM32-NEXT: Value (RelocatableAddress): 0xB0 296; SYM32-NEXT: Section: .data 297; SYM32-NEXT: Type: 0x0 298; SYM32-NEXT: StorageClass: C_HIDEXT (0x6B) 299; SYM32-NEXT: NumberOfAuxEntries: 1 300; SYM32-NEXT: CSECT Auxiliary Entry { 301; SYM32-NEXT: Index: [[#INDX+2]] 302; SYM32-NEXT: SectionLen: 4 303; SYM32-NEXT: ParameterHashIndex: 0x0 304; SYM32-NEXT: TypeChkSectNum: 0x0 305; SYM32-NEXT: SymbolAlignmentLog2: 2 306; SYM32-NEXT: SymbolType: XTY_SD (0x1) 307; SYM32-NEXT: StorageMappingClass: XMC_TC (0x3) 308; SYM32-NEXT: StabInfoIndex: 0x0 309; SYM32-NEXT: StabSectNum: 0x0 310; SYM32-NEXT: } 311; SYM32-NEXT: } 312; SYM32: Index: [[#INDX+5]] 313; SYM32-NEXT: Name: global_int_nonzero 314; SYM32-NEXT: Value (RelocatableAddress): 0x0 315; SYM32-NEXT: Section: .tdata 316; SYM32-NEXT: Type: 0x0 317; SYM32-NEXT: StorageClass: C_EXT (0x2) 318; SYM32-NEXT: NumberOfAuxEntries: 1 319; SYM32-NEXT: CSECT Auxiliary Entry { 320; SYM32-NEXT: Index: [[#INDX+6]] 321; SYM32-NEXT: ContainingCsectSymbolIndex: [[#INDX+3]] 322; SYM32-NEXT: ParameterHashIndex: 0x0 323; SYM32-NEXT: TypeChkSectNum: 0x0 324; SYM32-NEXT: SymbolAlignmentLog2: 0 325; SYM32-NEXT: SymbolType: XTY_LD (0x2) 326; SYM32-NEXT: StorageMappingClass: XMC_TL (0x14) 327; SYM32-NEXT: StabInfoIndex: 0x0 328; SYM32-NEXT: StabSectNum: 0x0 329; SYM32-NEXT: } 330; SYM32-NEXT: } 331; SYM32: Index: [[#INDX+7]] 332; SYM32-NEXT: Name: intern_int_zero 333; SYM32-NEXT: Value (RelocatableAddress): 0x4 334; SYM32-NEXT: Section: .tbss 335; SYM32-NEXT: Type: 0x0 336; SYM32-NEXT: StorageClass: C_HIDEXT (0x6B) 337; SYM32-NEXT: NumberOfAuxEntries: 1 338; SYM32-NEXT: CSECT Auxiliary Entry { 339; SYM32-NEXT: Index: [[#INDX+8]] 340; SYM32-NEXT: SectionLen: 4 341; SYM32-NEXT: ParameterHashIndex: 0x0 342; SYM32-NEXT: TypeChkSectNum: 0x0 343; SYM32-NEXT: SymbolAlignmentLog2: 2 344; SYM32-NEXT: SymbolType: XTY_CM (0x3) 345; SYM32-NEXT: StorageMappingClass: XMC_UL (0x15) 346; SYM32-NEXT: StabInfoIndex: 0x0 347; SYM32-NEXT: StabSectNum: 0x0 348; SYM32-NEXT: } 349; SYM32-NEXT: } 350 351; DIS32: file format aixcoff-rs6000 352; DIS32: Disassembly of section .text: 353; DIS32: (idx: [[#NFA+5]]) .store_intern_int_zero: 354; DIS32: R_TOC (idx: [[#NFA+19]]) intern_int_zero[TC] 355; DIS32: R_RBA (idx: [[#NFA+1]]) .__get_tpointer[PR] 356; DIS32: blr 357; DIS32: (idx: [[#NFA+7]]) .load_global_int_nonzero: 358; DIS32: R_TOC (idx: [[#NFA+21]]) global_int_nonzero[TC] 359; DIS32: R_RBA (idx: [[#NFA+1]]) .__get_tpointer[PR] 360; DIS32: blr 361; DIS32: (idx: [[#NFA+9]]) .load_intern_int_zero: 362; DIS32: R_TOC (idx: [[#NFA+19]]) intern_int_zero[TC] 363; DIS32: R_RBA (idx: [[#NFA+1]]) .__get_tpointer[PR] 364; DIS32: blr 365 366; DIS32: Disassembly of section .data: 367; DIS32: (idx: [[#NFA+11]]) store_intern_int_zero[DS]: 368; DIS32: R_POS (idx: [[#NFA+5]]) .store_intern_int_zero 369; DIS32: R_POS (idx: [[#NFA+17]]) TOC[TC0] 370; DIS32: (idx: [[#NFA+13]]) load_global_int_nonzero[DS]: 371; DIS32: R_POS (idx: [[#NFA+7]]) .load_global_int_nonzero 372; DIS32: R_POS (idx: [[#NFA+17]]) TOC[TC0] 373; DIS32: (idx: [[#NFA+15]]) load_intern_int_zero[DS]: 374; DIS32: R_POS (idx: [[#NFA+9]]) .load_intern_int_zero 375; DIS32: R_POS (idx: [[#NFA+17]]) TOC[TC0] 376; DIS32: (idx: [[#NFA+19]]) intern_int_zero[TC]: 377; DIS32: R_TLS_IE (idx: [[#NFA+27]]) intern_int_zero[UL] 378; DIS32: (idx: [[#NFA+21]]) global_int_nonzero[TC]: 379; DIS32: R_TLS_IE (idx: [[#NFA+25]]) global_int_nonzero 380 381; DIS32: Disassembly of section .tdata: 382; DIS32: (idx: [[#NFA+25]]) global_int_nonzero: 383 384; DIS32: Disassembly of section .tbss: 385; DIS32: (idx: [[#NFA+27]]) intern_int_zero[UL]: 386