1; Test of global initializers. 2 3; REQUIRES: allow_dump 4 5; Test initializers with -filetype=asm. 6; RUN: %if --need=target_X8632 --command %p2i --filetype=asm --target x8632 \ 7; RUN: -i %s --args -O2 -allow-externally-defined-symbols \ 8; RUN: | %if --need=target_X8632 --command FileCheck %s 9 10; RUN: %if --need=target_ARM32 --command %p2i --filetype=asm --target arm32 \ 11; RUN: -i %s --args -O2 \ 12; RUN: -allow-externally-defined-symbols \ 13; RUN: | %if --need=target_ARM32 --command FileCheck %s 14 15; Test instructions for materializing addresses. 16; RUN: %if --need=target_X8632 --command %p2i --filetype=asm --target x8632 \ 17; RUN: -i %s --args -O2 -allow-externally-defined-symbols \ 18; RUN: | %if --need=target_X8632 --command FileCheck %s --check-prefix=X8632 19 20; Test instructions with -filetype=obj and try to cross reference instructions 21; w/ the symbol table. 22; RUN: %if --need=target_X8632 --command %p2i --assemble --disassemble \ 23; RUN: --target x8632 -i %s --args --verbose none \ 24; RUN: -allow-externally-defined-symbols \ 25; RUN: | %if --need=target_X8632 --command FileCheck --check-prefix=IAS %s 26 27; RUN: %if --need=target_X8632 --command %p2i --assemble --disassemble \ 28; RUN: --dis-flags=-t --target x8632 -i %s --args --verbose none \ 29; RUN: -allow-externally-defined-symbols \ 30; RUN: | %if --need=target_X8632 --command FileCheck --check-prefix=SYMTAB %s 31 32; This is not really IAS, but we can switch when that is implemented. 33; For now we can at least see the instructions / relocations. 34; RUN: %if --need=target_ARM32 --command %p2i --filetype=asm --assemble \ 35; RUN: --disassemble --target arm32 -i %s \ 36; RUN: --args --verbose none \ 37; RUN: -allow-externally-defined-symbols \ 38; RUN: | %if --need=target_ARM32 --command FileCheck \ 39; RUN: --check-prefix=IASARM32 %s 40 41; RUN: %if --need=target_ARM32 --command %p2i --filetype=asm --assemble \ 42; RUN: --disassemble --dis-flags=-t --target arm32 -i %s \ 43; RUN: --args --verbose none \ 44; RUN: -allow-externally-defined-symbols \ 45; RUN: | %if --need=target_ARM32 --command FileCheck --check-prefix=SYMTAB %s 46 47; RUN: %if --need=target_MIPS32 --need=allow_dump \ 48; RUN: --command %p2i --filetype=asm --assemble --disassemble --target \ 49; RUN: mips32 -i %s --args -O2 -allow-externally-defined-symbols \ 50; RUN: | %if --need=target_MIPS32 --need=allow_dump \ 51; RUN: --command FileCheck --check-prefix=IASMIPS32 %s 52 53; RUN: %if --need=target_MIPS32 --need=allow_dump --command %p2i \ 54; RUN: --filetype=asm --assemble --disassemble --dis-flags=-t \ 55; RUN: --target mips32 -i %s --args --verbose none \ 56; RUN: -allow-externally-defined-symbols \ 57; RUN: | %if --need=target_MIPS32 --need=allow_dump \ 58; RUN: --command FileCheck --check-prefix=SYMTAB %s 59 60define internal i32 @main(i32 %argc, i32 %argv) { 61entry: 62 %expanded1 = ptrtoint [4 x i8]* @PrimitiveInit to i32 63 call void @use(i32 %expanded1) 64 %expanded3 = ptrtoint [4 x i8]* @PrimitiveInitConst to i32 65 call void @use(i32 %expanded3) 66 %expanded5 = ptrtoint [4 x i8]* @PrimitiveInitStatic to i32 67 call void @use(i32 %expanded5) 68 %expanded7 = ptrtoint [4 x i8]* @PrimitiveUninit to i32 69 call void @use(i32 %expanded7) 70 %expanded9 = ptrtoint [20 x i8]* @ArrayInit to i32 71 call void @use(i32 %expanded9) 72 %expanded11 = ptrtoint [40 x i8]* @ArrayInitPartial to i32 73 call void @use(i32 %expanded11) 74 %expanded13 = ptrtoint [20 x i8]* @ArrayUninit to i32 75 call void @use(i32 %expanded13) 76 ret i32 0 77} 78; X8632-LABEL: main 79; X8632: movl $PrimitiveInit, 80; X8632: movl $PrimitiveInitConst, 81; X8632: movl $PrimitiveInitStatic, 82; X8632: movl $PrimitiveUninit, 83; X8632: movl $ArrayInit, 84; X8632: movl $ArrayInitPartial, 85; X8632: movl $ArrayUninit, 86 87; objdump does not indicate what symbol the mov/relocation applies to 88; so we grep for "mov {{.*}}, OFFSET, sec", along with 89; "OFFSET {{.*}} sec {{.*}} symbol" in the symbol table as a sanity check. 90; NOTE: The symbol table sorting has no relation to the code's references. 91; IAS-LABEL: main 92; SYMTAB-LABEL: SYMBOL TABLE 93 94; SYMTAB-DAG: 00000000 {{.*}} .data {{.*}} PrimitiveInit 95; IAS: mov {{.*}},0x0 {{.*}} .data 96; IAS: call 97; IASARM32: movw {{.*}} PrimitiveInit 98; IASARM32: movt {{.*}} PrimitiveInit 99; IASARM32: bl 100; IASMIPS32: lui {{.*}} PrimitiveInit 101; IASMIPS32: addiu {{.*}} PrimitiveInit 102; IASMIPS32: jal 103 104; SYMTAB-DAG: 00000000 {{.*}} .rodata {{.*}} PrimitiveInitConst 105; IAS: mov {{.*}},0x0 {{.*}} .rodata 106; IAS: call 107; IASARM32: movw {{.*}} PrimitiveInitConst 108; IASARM32: movt {{.*}} PrimitiveInitConst 109; IASARM32: bl 110; IASMIPS32: lui {{.*}} PrimitiveInitConst 111; IASMIPS32: addiu {{.*}} PrimitiveInitConst 112; IASMIPS32: jal 113 114; SYMTAB-DAG: 00000000 {{.*}} .bss {{.*}} PrimitiveInitStatic 115; IAS: mov {{.*}},0x0 {{.*}} .bss 116; IAS: call 117; IASARM32: movw {{.*}} PrimitiveInitStatic 118; IASARM32: movt {{.*}} PrimitiveInitStatic 119; IASARM32: bl 120; IASMIPS32: lui {{.*}} PrimitiveInitStatic 121; IASMIPS32: addiu {{.*}} PrimitiveInitStatic 122; IASMIPS32: jal 123 124; SYMTAB-DAG: 00000004 {{.*}} .bss {{.*}} PrimitiveUninit 125; IAS: mov {{.*}},0x4 {{.*}} .bss 126; IAS: call 127; IASARM32: movw {{.*}} PrimitiveUninit 128; IASARM32: movt {{.*}} PrimitiveUninit 129; IASARM32: bl 130; IASMIPS32: lui {{.*}} PrimitiveUninit 131; IASMIPS32: addiu {{.*}} PrimitiveUninit 132; IASMIPS32: jal 133 134; SYMTAB-DAG: 00000004{{.*}}.data{{.*}}ArrayInit 135; IAS: mov {{.*}},0x4 {{.*}} .data 136; IAS: call 137; IASARM32: movw {{.*}} ArrayInit 138; IASARM32: movt {{.*}} ArrayInit 139; IASARM32: bl 140; IASMIPS32: lui {{.*}} ArrayInit 141; IASMIPS32: addiu {{.*}} ArrayInit 142; IASMIPS32: jal 143 144; SYMTAB-DAG: 00000018 {{.*}} .data {{.*}} ArrayInitPartial 145; IAS: mov {{.*}},0x18 {{.*}} .data 146; IAS: call 147; IASARM32: movw {{.*}} ArrayInitPartial 148; IASARM32: movt {{.*}} ArrayInitPartial 149; IASARM32: bl 150; IASMIPS32: lui {{.*}} ArrayInitPartial 151; IASMIPS32: addiu {{.*}} ArrayInitPartial 152; IASMIPS32: jal 153 154; SYMTAB-DAG: 00000008 {{.*}} .bss {{.*}} ArrayUninit 155; IAS: mov {{.*}},0x8 {{.*}} .bss 156; IAS: call 157; IASARM32: movw {{.*}} ArrayUninit 158; IASARM32: movt {{.*}} ArrayUninit 159; IASARM32: bl 160; IASMIPS32: lui {{.*}} ArrayUninit 161; IASMIPS32: addiu {{.*}} ArrayUninit 162; IASMIPS32: jal 163 164declare void @use(i32) 165 166define internal i32 @nacl_tp_tdb_offset(i32 %__0) { 167entry: 168 ret i32 0 169} 170 171define internal i32 @nacl_tp_tls_offset(i32 %size) { 172entry: 173 %result = sub i32 0, %size 174 ret i32 %result 175} 176 177 178@PrimitiveInit = internal global [4 x i8] c"\1B\00\00\00", align 4 179; CHECK: .type PrimitiveInit,%object 180; CHECK-NEXT: .section .data,"aw",%progbits 181; CHECK-NEXT: .p2align 2 182; CHECK-NEXT: PrimitiveInit: 183; CHECK-NEXT: .byte 184; CHECK: .size PrimitiveInit, 4 185 186@PrimitiveInitConst = internal constant [4 x i8] c"\0D\00\00\00", align 4 187; CHECK: .type PrimitiveInitConst,%object 188; CHECK-NEXT: .section .rodata,"a",%progbits 189; CHECK-NEXT: .p2align 2 190; CHECK-NEXT: PrimitiveInitConst: 191; CHECK-NEXT: .byte 192; CHECK: .size PrimitiveInitConst, 4 193 194@ArrayInit = internal global [20 x i8] c"\0A\00\00\00\14\00\00\00\1E\00\00\00(\00\00\002\00\00\00", align 4 195; CHECK: .type ArrayInit,%object 196; CHECK-NEXT: .section .data,"aw",%progbits 197; CHECK-NEXT: .p2align 2 198; CHECK-NEXT: ArrayInit: 199; CHECK-NEXT: .byte 200; CHECK: .size ArrayInit, 20 201 202@ArrayInitPartial = internal global [40 x i8] c"<\00\00\00F\00\00\00P\00\00\00Z\00\00\00d\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00", align 4 203; CHECK: .type ArrayInitPartial,%object 204; CHECK-NEXT: .section .data,"aw",%progbits 205; CHECK-NEXT: .p2align 2 206; CHECK-NEXT: ArrayInitPartial: 207; CHECK-NEXT: .byte 208; CHECK: .size ArrayInitPartial, 40 209 210@PrimitiveInitStatic = internal global [4 x i8] zeroinitializer, align 4 211; CHECK: .type PrimitiveInitStatic,%object 212; CHECK-NEXT: .section .bss,"aw",%nobits 213; CHECK-NEXT: .p2align 2 214; CHECK-NEXT: PrimitiveInitStatic: 215; CHECK-NEXT: .zero 4 216; CHECK-NEXT: .size PrimitiveInitStatic, 4 217 218@PrimitiveUninit = internal global [4 x i8] zeroinitializer, align 4 219; CHECK: .type PrimitiveUninit,%object 220; CHECK-NEXT: .section .bss,"aw",%nobits 221; CHECK-NEXT: .p2align 2 222; CHECK-NEXT: PrimitiveUninit: 223; CHECK-NEXT: .zero 4 224; CHECK-NEXT: .size PrimitiveUninit, 4 225 226@ArrayUninit = internal global [20 x i8] zeroinitializer, align 4 227; CHECK: .type ArrayUninit,%object 228; CHECK-NEXT: .section .bss,"aw",%nobits 229; CHECK-NEXT: .p2align 2 230; CHECK-NEXT: ArrayUninit: 231; CHECK-NEXT: .zero 20 232; CHECK-NEXT: .size ArrayUninit, 20 233 234@ArrayUninitConstDouble = internal constant [200 x i8] zeroinitializer, align 8 235; CHECK: .type ArrayUninitConstDouble,%object 236; CHECK-NEXT: .section .rodata,"a",%progbits 237; CHECK-NEXT: .p2align 3 238; CHECK-NEXT: ArrayUninitConstDouble: 239; CHECK-NEXT: .zero 200 240; CHECK-NEXT: .size ArrayUninitConstDouble, 200 241 242@ArrayUninitConstInt = internal constant [20 x i8] zeroinitializer, align 4 243; CHECK: .type ArrayUninitConstInt,%object 244; CHECK: .section .rodata,"a",%progbits 245; CHECK-NEXT: .p2align 2 246; CHECK-NEXT: ArrayUninitConstInt: 247; CHECK-NEXT: .zero 20 248; CHECK-NEXT: .size ArrayUninitConstInt, 20 249 250@__init_array_start = internal constant [0 x i8] zeroinitializer, align 4 251@__fini_array_start = internal constant [0 x i8] zeroinitializer, align 4 252@__tls_template_start = internal constant [0 x i8] zeroinitializer, align 8 253@__tls_template_alignment = internal constant [4 x i8] c"\01\00\00\00", align 4 254