1; Tests if we handle global variables with relocation initializers. 2 3; REQUIRES: allow_dump 4 5; Test that we handle it in the ICE converter. 6; RUN: %lc2i -i %s --args -verbose inst -threads=0 \ 7; RUN: | %iflc FileCheck %s 8; RUN: %lc2i -i %s --args -verbose inst,global_init -threads=0 \ 9; RUN: | %iflc FileCheck --check-prefix=DUMP %s 10 11; Test that we handle it using Subzero's bitcode reader. 12; RUN: %p2i -i %s --args -verbose inst -threads=0 \ 13; RUN: | FileCheck %s 14; RUN: %p2i -i %s --args -verbose inst,global_init -threads=0 \ 15; RUN: | FileCheck --check-prefix=DUMP %s 16 17@bytes = internal global [7 x i8] c"abcdefg" 18; DUMP: @bytes = internal global [7 x i8] c"abcdefg" 19; CHECK: .type bytes,%object 20; CHECK: .section .data,"aw",%progbits 21; CHECK:bytes: 22; CHECK: .byte 97 23; CHECK: .byte 98 24; CHECK: .byte 99 25; CHECK: .byte 100 26; CHECK: .byte 101 27; CHECK: .byte 102 28; CHECK: .byte 103 29; CHECK: .size bytes, 7 30 31@const_bytes = internal constant [7 x i8] c"abcdefg" 32; DUMP: @const_bytes = internal constant [7 x i8] c"abcdefg" 33; CHECK: .type const_bytes,%object 34; CHECK: .section .rodata,"a",%progbits 35; CHECK:const_bytes: 36; CHECK: .byte 97 37; CHECK: .byte 98 38; CHECK: .byte 99 39; CHECK: .byte 100 40; CHECK: .byte 101 41; CHECK: .byte 102 42; CHECK: .byte 103 43; CHECK: .size const_bytes, 7 44 45@ptr_to_ptr = internal global i32 ptrtoint (i32* @ptr to i32) 46; DUMP: @ptr_to_ptr = internal global i32 ptrtoint (i32* @ptr to i32) 47; CHECK: .type ptr_to_ptr,%object 48; CHECK: .section .data,"aw",%progbits 49; CHECK:ptr_to_ptr: 50; CHECK: .long ptr 51; CHECK: .size ptr_to_ptr, 4 52 53@const_ptr_to_ptr = internal constant i32 ptrtoint (i32* @ptr to i32) 54; DUMP: @const_ptr_to_ptr = internal constant i32 ptrtoint (i32* @ptr to i32) 55; CHECK: .type const_ptr_to_ptr,%object 56; CHECK: .section .rodata,"a",%progbits 57; CHECK:const_ptr_to_ptr: 58; CHECK: .long ptr 59; CHECK: .size const_ptr_to_ptr, 4 60 61@ptr_to_func = internal global i32 ptrtoint (void ()* @func to i32) 62; DUMP: @ptr_to_func = internal global i32 ptrtoint (void ()* @func to i32) 63; CHECK: .type ptr_to_func,%object 64; CHECK: .section .data,"aw",%progbits 65; CHECK:ptr_to_func: 66; CHECK: .long func 67; CHECK: .size ptr_to_func, 4 68 69@const_ptr_to_func = internal constant i32 ptrtoint (void ()* @func to i32) 70; DUMP: @const_ptr_to_func = internal constant i32 ptrtoint (void ()* @func to i32) 71; CHECK: .type const_ptr_to_func,%object 72; CHECK: .section .rodata,"a",%progbits 73; CHECK:const_ptr_to_func: 74; CHECK: .long func 75; CHECK: .size const_ptr_to_func, 4 76 77@compound = internal global <{ [3 x i8], i32 }> <{ [3 x i8] c"foo", i32 ptrtoint (void ()* @func to i32) }> 78; DUMP: @compound = internal global <{ [3 x i8], i32 }> <{ [3 x i8] c"foo", i32 ptrtoint (void ()* @func to i32) }> 79; CHECK: .type compound,%object 80; CHECK: .section .data,"aw",%progbits 81; CHECK:compound: 82; CHECK: .byte 102 83; CHECK: .byte 111 84; CHECK: .byte 111 85; CHECK: .long func 86; CHECK: .size compound, 7 87 88@const_compound = internal constant <{ [3 x i8], i32 }> <{ [3 x i8] c"foo", i32 ptrtoint (void ()* @func to i32) }> 89; DUMP: @const_compound = internal constant <{ [3 x i8], i32 }> <{ [3 x i8] c"foo", i32 ptrtoint (void ()* @func to i32) }> 90; CHECK: .type const_compound,%object 91; CHECK: .section .rodata,"a",%progbits 92; CHECK:const_compound: 93; CHECK: .byte 102 94; CHECK: .byte 111 95; CHECK: .byte 111 96; CHECK: .long func 97; CHECK: .size const_compound, 7 98 99@ptr = internal global i32 ptrtoint ([7 x i8]* @bytes to i32) 100; DUMP: @ptr = internal global i32 ptrtoint ([7 x i8]* @bytes to i32) 101; CHECK: .type ptr,%object 102; CHECK: .section .data,"aw",%progbits 103; CHECK:ptr: 104; CHECK: .long bytes 105; CHECK: .size ptr, 4 106 107@const_ptr = internal constant i32 ptrtoint ([7 x i8]* @bytes to i32) 108; DUMP: @const_ptr = internal constant i32 ptrtoint ([7 x i8]* @bytes to i32) 109; CHECK: .type const_ptr,%object 110; CHECK: .section .rodata,"a",%progbits 111; CHECK:const_ptr: 112; CHECK: .long bytes 113; CHECK: .size const_ptr, 4 114 115@addend_ptr = internal global i32 add (i32 ptrtoint (i32* @ptr to i32), i32 1) 116; DUMP: @addend_ptr = internal global i32 add (i32 ptrtoint (i32* @ptr to i32), i32 1) 117; CHECK: .type addend_ptr,%object 118; CHECK: .section .data,"aw",%progbits 119; CHECK:addend_ptr: 120; CHECK: .long ptr + 1 121; CHECK: .size addend_ptr, 4 122 123@const_addend_ptr = internal constant i32 add (i32 ptrtoint (i32* @ptr to i32), i32 1) 124; DUMP: @const_addend_ptr = internal constant i32 add (i32 ptrtoint (i32* @ptr to i32), i32 1) 125; CHECK: .type const_addend_ptr,%object 126; CHECK: .section .rodata,"a",%progbits 127; CHECK:const_addend_ptr: 128; CHECK: .long ptr + 1 129; CHECK: .size const_addend_ptr, 4 130 131@addend_negative = internal global i32 add (i32 ptrtoint (i32* @ptr to i32), i32 -1) 132; DUMP: @addend_negative = internal global i32 add (i32 ptrtoint (i32* @ptr to i32), i32 -1) 133; CHECK: .type addend_negative,%object 134; CHECK: .section .data,"aw",%progbits 135; CHECK:addend_negative: 136; CHECK: .long ptr - 1 137; CHECK: .size addend_negative, 4 138 139@const_addend_negative = internal constant i32 add (i32 ptrtoint (i32* @ptr to i32), i32 -1) 140; DUMP: @const_addend_negative = internal constant i32 add (i32 ptrtoint (i32* @ptr to i32), i32 -1) 141; CHECK: .type const_addend_negative,%object 142; CHECK: .section .rodata,"a",%progbits 143; CHECK:const_addend_negative: 144; CHECK: .long ptr - 1 145; CHECK: .size const_addend_negative, 4 146 147@addend_array1 = internal global i32 add (i32 ptrtoint ([7 x i8]* @bytes to i32), i32 1) 148; DUMP: @addend_array1 = internal global i32 add (i32 ptrtoint ([7 x i8]* @bytes to i32), i32 1) 149; CHECK: .type addend_array1,%object 150; CHECK: .section .data,"aw",%progbits 151; CHECK:addend_array1: 152; CHECK: .long bytes + 1 153; CHECK: .size addend_array1, 4 154 155@const_addend_array1 = internal constant i32 add (i32 ptrtoint ([7 x i8]* @bytes to i32), i32 1) 156; DUMP: @const_addend_array1 = internal constant i32 add (i32 ptrtoint ([7 x i8]* @bytes to i32), i32 1) 157; CHECK: .type const_addend_array1,%object 158; CHECK: .section .rodata,"a",%progbits 159; CHECK:const_addend_array1: 160; CHECK: .long bytes + 1 161; CHECK: .size const_addend_array1, 4 162 163@addend_array2 = internal global i32 add (i32 ptrtoint ([7 x i8]* @bytes to i32), i32 7) 164; DUMP: @addend_array2 = internal global i32 add (i32 ptrtoint ([7 x i8]* @bytes to i32), i32 7) 165; CHECK: .type addend_array2,%object 166; CHECK: .section .data,"aw",%progbits 167; CHECK:addend_array2: 168; CHECK: .long bytes + 7 169; CHECK: .size addend_array2, 4 170 171@const_addend_array2 = internal constant i32 add (i32 ptrtoint ([7 x i8]* @bytes to i32), i32 7) 172; DUMP: @const_addend_array2 = internal constant i32 add (i32 ptrtoint ([7 x i8]* @bytes to i32), i32 7) 173; CHECK: .type const_addend_array2,%object 174; CHECK: .section .rodata,"a",%progbits 175; CHECK:const_addend_array2: 176; CHECK: .long bytes + 7 177; CHECK: .size const_addend_array2, 4 178 179@addend_array3 = internal global i32 add (i32 ptrtoint ([7 x i8]* @bytes to i32), i32 9) 180; DUMP: @addend_array3 = internal global i32 add (i32 ptrtoint ([7 x i8]* @bytes to i32), i32 9) 181; CHECK: .type addend_array3,%object 182; CHECK: .section .data,"aw",%progbits 183; CHECK:addend_array3: 184; CHECK: .long bytes + 9 185; CHECK: .size addend_array3, 4 186 187@const_addend_array3 = internal constant i32 add (i32 ptrtoint ([7 x i8]* @bytes to i32), i32 9) 188; DUMP: @const_addend_array3 = internal constant i32 add (i32 ptrtoint ([7 x i8]* @bytes to i32), i32 9) 189; CHECK: .type const_addend_array3,%object 190; CHECK: .section .rodata,"a",%progbits 191; CHECK:const_addend_array3: 192; CHECK: .long bytes + 9 193; CHECK: .size const_addend_array3, 4 194 195@addend_struct1 = internal global i32 add (i32 ptrtoint (<{ [3 x i8], i32 }>* @compound to i32), i32 1) 196; DUMP: @addend_struct1 = internal global i32 add (i32 ptrtoint (<{ [3 x i8], i32 }>* @compound to i32), i32 1) 197; CHECK: .type addend_struct1,%object 198; CHECK: .section .data,"aw",%progbits 199; CHECK:addend_struct1: 200; CHECK: .long compound + 1 201; CHECK: .size addend_struct1, 4 202 203@const_addend_struct1 = internal constant i32 add (i32 ptrtoint (<{ [3 x i8], i32 }>* @compound to i32), i32 1) 204; DUMP: @const_addend_struct1 = internal constant i32 add (i32 ptrtoint (<{ [3 x i8], i32 }>* @compound to i32), i32 1) 205; CHECK: .type const_addend_struct1,%object 206; CHECK: .section .rodata,"a",%progbits 207; CHECK:const_addend_struct1: 208; CHECK: .long compound + 1 209; CHECK: .size const_addend_struct1, 4 210 211@addend_struct2 = internal global i32 add (i32 ptrtoint (<{ [3 x i8], i32 }>* @compound to i32), i32 4) 212; DUMP: @addend_struct2 = internal global i32 add (i32 ptrtoint (<{ [3 x i8], i32 }>* @compound to i32), i32 4) 213; CHECK: .type addend_struct2,%object 214; CHECK: .section .data,"aw",%progbits 215; CHECK:addend_struct2: 216; CHECK: .long compound + 4 217; CHECK: .size addend_struct2, 4 218 219@const_addend_struct2 = internal constant i32 add (i32 ptrtoint (<{ [3 x i8], i32 }>* @compound to i32), i32 4) 220; DUMP: @const_addend_struct2 = internal constant i32 add (i32 ptrtoint (<{ [3 x i8], i32 }>* @compound to i32), i32 4) 221; CHECK: .type const_addend_struct2,%object 222; CHECK: .section .rodata,"a",%progbits 223; CHECK:const_addend_struct2: 224; CHECK: .long compound + 4 225; CHECK: .size const_addend_struct2, 4 226 227@ptr_to_func_align = internal global i32 ptrtoint (void ()* @func to i32), align 8 228; DUMP: @ptr_to_func_align = internal global i32 ptrtoint (void ()* @func to i32), align 8 229; CHECK: .type ptr_to_func_align,%object 230; CHECK: .section .data,"aw",%progbits 231; CHECK: .p2align 3 232; CHECK:ptr_to_func_align: 233; CHECK: .long func 234; CHECK: .size ptr_to_func_align, 4 235 236@const_ptr_to_func_align = internal constant i32 ptrtoint (void ()* @func to i32), align 8 237; DUMP: @const_ptr_to_func_align = internal constant i32 ptrtoint (void ()* @func to i32), align 8 238; CHECK: .type const_ptr_to_func_align,%object 239; CHECK: .section .rodata,"a",%progbits 240; CHECK: .p2align 3 241; CHECK:const_ptr_to_func_align: 242; CHECK: .long func 243; CHECK: .size const_ptr_to_func_align, 4 244 245@char = internal constant [1 x i8] c"0" 246; DUMP: @char = internal constant [1 x i8] c"0" 247; CHECK: .type char,%object 248; CHECK: .section .rodata,"a",%progbits 249; CHECK:char: 250; CHECK: .byte 48 251; CHECK: .size char, 1 252 253@short = internal constant [2 x i8] zeroinitializer 254; DUMP: @short = internal constant [2 x i8] zeroinitializer 255; CHECK: .type short,%object 256; CHECK: .section .rodata,"a",%progbits 257; CHECK:short: 258; CHECK: .zero 2 259; CHECK: .size short, 2 260 261define internal void @func() { 262 ret void 263} 264 265; DUMP: define internal void @func() { 266