1; Tests that we generate an ELF container with fields that make sense, 2; cross-validating against llvm-mc. 3 4; For the integrated ELF writer, we can't pipe the output because we need 5; to seek backward and patch up the file headers. So, use a temporary file. 6; RUN: %p2i -i %s --filetype=obj --output %t --args -O2 --verbose none \ 7; RUN: -allow-externally-defined-symbols \ 8; RUN: && llvm-readobj -file-headers -sections -section-data \ 9; RUN: -relocations -symbols %t | FileCheck %s 10 11; RUN: %if --need=allow_dump --command %p2i -i %s --args -O2 --verbose none \ 12; RUN: -allow-externally-defined-symbols \ 13; RUN: | %if --need=allow_dump --command llvm-mc -triple=i686-nacl \ 14; RUN: -filetype=obj -o - \ 15; RUN: | %if --need=allow_dump --command llvm-readobj -file-headers \ 16; RUN: -sections -section-data -relocations -symbols - \ 17; RUN: | %if --need=allow_dump --command FileCheck %s 18 19; Add a run that shows relocations in code inline. 20; RUN: %p2i -i %s --filetype=obj --output %t --disassemble --args -O2 \ 21; RUN: -allow-externally-defined-symbols \ 22; RUN: | FileCheck --check-prefix=TEXT-RELOCS %s 23 24; Use intrinsics to test external calls. 25declare void @llvm.memcpy.p0i8.p0i8.i32(i8*, i8*, i32, i32, i1) 26declare void @llvm.memset.p0i8.i32(i8*, i8, i32, i32, i1) 27 28; Try other external functions (for cross tests). 29; Not testing external global variables since the NaCl bitcode writer 30; refuses to freeze such IR. 31declare void @external_foo(i32) 32 33; Test some global data relocs (data, rodata, bss). 34@bytes = internal global [7 x i8] c"ab\03\FF\F6fg", align 1 35@bytes_const = internal constant [7 x i8] c"ab\03\FF\F6fg", align 1 36 37@ptr = internal global i32 ptrtoint ([7 x i8]* @bytes to i32), align 16 38@ptr_const = internal constant i32 ptrtoint ([7 x i8]* @bytes to i32), align 16 39 40@ptr_to_func = internal global i32 ptrtoint (double ()* @returnDoubleConst to i32), align 4 41@ptr_to_func_const = internal constant i32 ptrtoint (double ()* @returnDoubleConst to i32), align 4 42 43@addend_ptr = internal global i32 add (i32 ptrtoint (i32* @ptr to i32), i32 128), align 4 44@addend_ptr_const = internal constant i32 add (i32 ptrtoint (i32* @ptr to i32), i32 64), align 4 45 46@short_zero = internal global [2 x i8] zeroinitializer, align 2 47@double_zero = internal global [8 x i8] zeroinitializer, align 32 48@double_zero2 = internal global [8 x i8] zeroinitializer, align 8 49@short_zero_const = internal constant [2 x i8] zeroinitializer, align 2 50@double_zero_const = internal constant [8 x i8] zeroinitializer, align 32 51@double_zero_const2 = internal constant [8 x i8] zeroinitializer, align 8 52 53; Use float/double constants to test constant pools. 54define internal float @returnFloatConst() { 55entry: 56 %f = fadd float -0.0, 0x3FF3AE1400000000 57 ret float %f 58} 59; TEXT-RELOCS-LABEL: returnFloatConst 60; TEXT-RELOCS: movss {{.*}} R_386_32 {{.*}}80000000 61; TEXT-RELOCS: addss {{.*}} R_386_32 {{.*}}3f9d70a0 62 63define internal double @returnDoubleConst() { 64entry: 65 %d = fadd double 0x7FFFFFFFFFFFFFFFF, 0xFFF7FFFFFFFFFFFF 66 %d2 = fadd double %d, 0xFFF8000000000003 67 ret double %d2 68} 69; TEXT-RELOCS-LABEL: returnDoubleConst 70; TEXT-RELOCS: movsd {{.*}} R_386_32 {{.*}}ffffffffffffffff 71; TEXT-RELOCS: addsd {{.*}} R_386_32 {{.*}}fff7ffffffffffff 72; TEXT-RELOCS: addsd {{.*}} R_386_32 {{.*}}fff8000000000003 73 74; Test intrinsics that call out to external functions. 75define internal void @test_memcpy(i32 %iptr_dst, i32 %len) { 76entry: 77 %dst = inttoptr i32 %iptr_dst to i8* 78 %src = bitcast [7 x i8]* @bytes to i8* 79 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dst, i8* %src, 80 i32 %len, i32 1, i1 false) 81 ret void 82} 83; TEXT-RELOCS-LABEL: test_memcpy 84; TEXT-RELOCS: mov {{.*}} R_386_32 {{bytes|.data}} 85 86define internal void @test_memset(i32 %iptr_dst, i32 %wide_val, i32 %len) { 87entry: 88 %val = trunc i32 %wide_val to i8 89 %dst = inttoptr i32 %iptr_dst to i8* 90 call void @llvm.memset.p0i8.i32(i8* %dst, i8 %val, 91 i32 %len, i32 1, i1 false) 92 ret void 93} 94; TEXT-RELOCS-LABEL: test_memset 95 96; Test calling internal functions (may be able to do the fixup, 97; without emitting a relocation). 98define internal float @test_call_internal() { 99 %f = call float @returnFloatConst() 100 ret float %f 101} 102 103; Test calling an external function. 104define internal void @test_call_external() { 105 call void @external_foo(i32 42) 106 ret void 107} 108 109; Test copying a function pointer, or a global data pointer. 110define internal i32 @test_ret_fp() { 111 %r = ptrtoint float ()* @returnFloatConst to i32 112 ret i32 %r 113} 114; TEXT-RELOCS-LABEL: test_ret_fp 115; TEXT-RELOCS-NEXT: mov {{.*}} R_386_32 {{returnFloatConst|.text}} 116 117define internal i32 @test_ret_global_pointer() { 118 %r = ptrtoint [7 x i8]* @bytes to i32 119 ret i32 %r 120} 121; TEXT-RELOCS-LABEL: test_ret_global_pointer 122; TEXT-RELOCS-NEXT: mov {{.*}} R_386_32 {{bytes|.data}} 123 124; Test defining a non-internal function. 125define void @_start(i32) { 126 %f = call float @returnFloatConst() 127 %d = call double @returnDoubleConst() 128 call void @test_memcpy(i32 0, i32 99) 129 call void @test_memset(i32 0, i32 0, i32 99) 130 %f2 = call float @test_call_internal() 131 %p1 = call i32 @test_ret_fp() 132 %p2 = call i32 @test_ret_global_pointer() 133 ret void 134} 135 136; CHECK: ElfHeader { 137; CHECK: Ident { 138; CHECK: Magic: (7F 45 4C 46) 139; CHECK: Class: 32-bit 140; CHECK: DataEncoding: LittleEndian 141; CHECK: OS/ABI: SystemV (0x0) 142; CHECK: ABIVersion: 0 143; CHECK: Unused: (00 00 00 00 00 00 00) 144; CHECK: } 145; CHECK: Type: Relocatable (0x1) 146; CHECK: Machine: EM_386 (0x3) 147; CHECK: Version: 1 148; CHECK: Entry: 0x0 149; CHECK: ProgramHeaderOffset: 0x0 150; CHECK: SectionHeaderOffset: 0x{{[1-9A-F][0-9A-F]*}} 151; CHECK: Flags [ (0x0) 152; CHECK: ] 153; CHECK: HeaderSize: 52 154; CHECK: ProgramHeaderEntrySize: 0 155; CHECK: ProgramHeaderCount: 0 156; CHECK: SectionHeaderEntrySize: 40 157; CHECK: SectionHeaderCount: {{[1-9][0-9]*}} 158; CHECK: StringTableSectionIndex: {{[1-9][0-9]*}} 159; CHECK: } 160 161 162; CHECK: Sections [ 163; CHECK: Section { 164; CHECK: Index: 0 165; CHECK: Name: (0) 166; CHECK: Type: SHT_NULL 167; CHECK: Flags [ (0x0) 168; CHECK: ] 169; CHECK: Address: 0x0 170; CHECK: Offset: 0x0 171; CHECK: Size: 0 172; CHECK: Link: 0 173; CHECK: Info: 0 174; CHECK: AddressAlignment: 0 175; CHECK: EntrySize: 0 176; CHECK: SectionData ( 177; CHECK: ) 178; CHECK: } 179; CHECK: Section { 180; CHECK: Index: {{[1-9][0-9]*}} 181; CHECK: Name: .text 182; CHECK: Type: SHT_PROGBITS 183; CHECK: Flags [ (0x6) 184; CHECK: SHF_ALLOC 185; CHECK: SHF_EXECINSTR 186; CHECK: ] 187; CHECK: Address: 0x0 188; CHECK: Offset: 0x{{[1-9A-F][0-9A-F]*}} 189; CHECK: Size: {{[1-9][0-9]*}} 190; CHECK: Link: 0 191; CHECK: Info: 0 192; CHECK: AddressAlignment: 32 193; CHECK: EntrySize: 0 194; CHECK: SectionData ( 195; There's probably halt padding (0xF4) in there somewhere. 196; CHECK: {{.*}}F4 197; CHECK: ) 198; CHECK: } 199; CHECK: Section { 200; CHECK: Index: {{[1-9][0-9]*}} 201; CHECK: Name: .rel.text 202; CHECK: Type: SHT_REL 203; CHECK: Flags [ (0x0) 204; CHECK: ] 205; CHECK: Address: 0x0 206; CHECK: Offset: 0x{{[1-9A-F][0-9A-F]*}} 207; CHECK: Size: {{[1-9][0-9]*}} 208; CHECK: Link: [[SYMTAB_INDEX:[1-9][0-9]*]] 209; CHECK: Info: {{[1-9][0-9]*}} 210; CHECK: AddressAlignment: 4 211; CHECK: EntrySize: 8 212; CHECK: SectionData ( 213; CHECK: ) 214; CHECK: } 215; CHECK: Section { 216; CHECK: Index: [[DATA_INDEX:[1-9][0-9]*]] 217; CHECK: Name: .data 218; CHECK: Type: SHT_PROGBITS 219; CHECK: Flags [ (0x3) 220; CHECK: SHF_ALLOC 221; CHECK: SHF_WRITE 222; CHECK: ] 223; CHECK: Address: 0x0 224; CHECK: Offset: 0x{{[1-9A-F][0-9A-F]*}} 225; CHECK: Size: 28 226; CHECK: Link: 0 227; CHECK: Info: 0 228; CHECK: AddressAlignment: 16 229; CHECK: EntrySize: 0 230; CHECK: SectionData ( 231; CHECK: 0000: 616203FF F66667{{.*}} |ab...fg 232; CHECK: ) 233; CHECK: } 234; CHECK: Section { 235; CHECK: Index: {{[1-9][0-9]*}} 236; CHECK: Name: .rel.data 237; CHECK: Type: SHT_REL 238; CHECK: Flags [ (0x0) 239; CHECK: ] 240; CHECK: Address: 0x0 241; CHECK: Offset: 0x{{[1-9A-F][0-9A-F]*}} 242; CHECK: Size: 24 243; CHECK: Link: [[SYMTAB_INDEX]] 244; CHECK: Info: [[DATA_INDEX]] 245; CHECK: AddressAlignment: 4 246; CHECK: EntrySize: 8 247; CHECK: SectionData ( 248; CHECK: ) 249; CHECK: } 250; CHECK: Section { 251; CHECK: Index: {{[1-9][0-9]*}} 252; CHECK: Name: .bss 253; CHECK: Type: SHT_NOBITS 254; CHECK: Flags [ (0x3) 255; CHECK: SHF_ALLOC 256; CHECK: SHF_WRITE 257; CHECK: ] 258; CHECK: Address: 0x0 259; CHECK: Offset: 0x{{[1-9A-F][0-9A-F]*}} 260; CHECK: Size: 48 261; CHECK: Link: 0 262; CHECK: Info: 0 263; CHECK: AddressAlignment: 32 264; CHECK: EntrySize: 0 265; CHECK: } 266; CHECK: Section { 267; CHECK: Index: {{[1-9][0-9]*}} 268; CHECK: Name: .rodata 269; CHECK: Type: SHT_PROGBITS 270; CHECK: Flags [ (0x2) 271; CHECK: SHF_ALLOC 272; CHECK: ] 273; CHECK: Address: 0x0 274; CHECK: Offset: 0x{{[1-9A-F][0-9A-F]*}} 275; CHECK: Size: 48 276; CHECK: Link: 0 277; CHECK: Info: 0 278; CHECK: AddressAlignment: 32 279; CHECK: EntrySize: 0 280; CHECK: SectionData ( 281; CHECK: 0000: 616203FF F66667{{.*}} |ab...fg 282; CHECK: ) 283; CHECK: } 284; CHECK: Section { 285; CHECK: Index: {{[1-9][0-9]*}} 286; CHECK: Name: .rel.rodata 287; CHECK: Type: SHT_REL 288; CHECK: Flags [ (0x0) 289; CHECK: ] 290; CHECK: Address: 0x0 291; CHECK: Offset: 0x{{[1-9A-F][0-9A-F]*}} 292; CHECK: Size: {{[1-9][0-9]*}} 293; CHECK: Link: [[SYMTAB_INDEX]] 294; CHECK: Info: {{[1-9][0-9]*}} 295; CHECK: AddressAlignment: 4 296; CHECK: EntrySize: 8 297; CHECK: SectionData ( 298; CHECK: ) 299; CHECK: } 300; CHECK: Section { 301; CHECK: Index: {{[1-9][0-9]*}} 302; CHECK: Name: .rodata.cst4 303; CHECK: Type: SHT_PROGBITS 304; CHECK: Flags [ (0x12) 305; CHECK: SHF_ALLOC 306; CHECK: SHF_MERGE 307; CHECK: ] 308; CHECK: Address: 0x0 309; CHECK: Offset: 0x{{[1-9A-F][0-9A-F]*}} 310; CHECK: Size: 8 311; CHECK: Link: 0 312; CHECK: Info: 0 313; CHECK: AddressAlignment: 4 314; CHECK: EntrySize: 4 315; CHECK: SectionData ( 316; CHECK: 0000: A0709D3F 00000080 317; CHECK: ) 318; CHECK: } 319; CHECK: Section { 320; CHECK: Index: {{[1-9][0-9]*}} 321; CHECK: Name: .rodata.cst8 322; CHECK: Type: SHT_PROGBITS 323; CHECK: Flags [ (0x12) 324; CHECK: SHF_ALLOC 325; CHECK: SHF_MERGE 326; CHECK: ] 327; CHECK: Address: 0x0 328; CHECK: Offset: 0x{{[1-9A-F][0-9A-F]*}} 329; CHECK: Size: 24 330; CHECK: Link: 0 331; CHECK: Info: 0 332; CHECK: AddressAlignment: 8 333; CHECK: EntrySize: 8 334; CHECK: SectionData ( 335; CHECK: 0000: FFFFFFFF FFFFF7FF 03000000 0000F8FF 336; CHECK: 0010: FFFFFFFF FFFFFFFF 337; CHECK: ) 338; CHECK: } 339; CHECK: Section { 340; CHECK: Index: {{[1-9][0-9]*}} 341; CHECK: Name: .shstrtab 342; CHECK: Type: SHT_STRTAB 343; CHECK: Flags [ (0x0) 344; CHECK: ] 345; CHECK: Address: 0x0 346; CHECK: Offset: 0x{{[1-9A-F][0-9A-F]*}} 347; CHECK: Size: {{[1-9][0-9]*}} 348; CHECK: Link: 0 349; CHECK: Info: 0 350; CHECK: AddressAlignment: 1 351; CHECK: EntrySize: 0 352; CHECK: SectionData ( 353; CHECK: {{.*}}.text{{.*}} 354; CHECK: ) 355; CHECK: } 356; CHECK: Section { 357; CHECK: Index: [[SYMTAB_INDEX]] 358; CHECK-NEXT: Name: .symtab 359; CHECK: Type: SHT_SYMTAB 360; CHECK: Flags [ (0x0) 361; CHECK: ] 362; CHECK: Address: 0x0 363; CHECK: Offset: 0x{{[1-9A-F][0-9A-F]*}} 364; CHECK: Size: {{[1-9][0-9]*}} 365; CHECK: Link: [[STRTAB_INDEX:[1-9][0-9]*]] 366; CHECK: Info: [[GLOBAL_START_INDEX:[1-9][0-9]*]] 367; CHECK: AddressAlignment: 4 368; CHECK: EntrySize: 16 369; CHECK: } 370; CHECK: Section { 371; CHECK: Index: [[STRTAB_INDEX]] 372; CHECK-NEXT: Name: .strtab 373; CHECK: Type: SHT_STRTAB 374; CHECK: Flags [ (0x0) 375; CHECK: ] 376; CHECK: Address: 0x0 377; CHECK: Offset: 0x{{[1-9A-F][0-9A-F]*}} 378; CHECK: Size: {{[1-9][0-9]*}} 379; CHECK: Link: 0 380; CHECK: Info: 0 381; CHECK: AddressAlignment: 1 382; CHECK: EntrySize: 0 383; CHECK: } 384 385 386; CHECK: Relocations [ 387; CHECK: Section ({{[0-9]+}}) .rel.text { 388; CHECK: 0x7 R_386_32 {{.*}}80000000 0x0 389; CHECK: 0xF R_386_32 {{.*}}3f9d70a0 0x0 390; CHECK: 0x27 R_386_32 {{.*}}ffffffffffffffff 0x0 391; CHECK: 0x2F R_386_32 {{.*}}fff7ffffffffffff 0x0 392; CHECK: 0x37 R_386_32 {{.*}}fff8000000000003 0x0 393; CHECK: 0x{{.*}} R_386_PC32 memcpy 394; CHECK: 0x{{.*}} R_386_PC32 memset 395; CHECK: 0x{{.*}} R_386_PC32 external_foo 396; CHECK: } 397; CHECK: Section ({{[0-9]+}}) .rel.data { 398; The set of relocations between llvm-mc and the integrated elf-writer 399; are different. For local symbols, llvm-mc uses the section + offset within 400; the section, while the integrated elf-writer refers the symbol itself. 401; CHECK: 0x10 R_386_32 {{.*}} 0x0 402; CHECK: 0x14 R_386_32 {{.*}} 0x0 403; CHECK: 0x18 R_386_32 {{.*}} 0x0 404; CHECK: } 405; CHECK: Section ({{[0-9]+}}) .rel.rodata { 406; CHECK: 0x10 R_386_32 {{.*}} 0x0 407; CHECK: 0x14 R_386_32 {{.*}} 0x0 408; CHECK: 0x18 R_386_32 {{.*}} 0x0 409; CHECK: } 410; CHECK: ] 411 412 413; CHECK: Symbols [ 414; CHECK-NEXT: Symbol { 415; CHECK-NEXT: Name: (0) 416; CHECK-NEXT: Value: 0x0 417; CHECK-NEXT: Size: 0 418; CHECK-NEXT: Binding: Local 419; CHECK-NEXT: Type: None 420; CHECK-NEXT: Other: 0 421; CHECK-NEXT: Section: Undefined (0x0) 422; CHECK-NEXT: } 423; CHECK: Symbol { 424; CHECK: Name: {{.*}}fff8000000000003 425; CHECK-NEXT: Value: 0x8 426; CHECK-NEXT: Size: 0 427; CHECK-NEXT: Binding: Local (0x0) 428; CHECK-NEXT: Type: None (0x0) 429; CHECK-NEXT: Other: 0 430; CHECK-NEXT: Section: .rodata.cst8 431; CHECK-NEXT: } 432; CHECK: Symbol { 433; CHECK: Name: {{.*}}ffffffffffffffff 434; CHECK-NEXT: Value: 0x10 435; CHECK-NEXT: Size: 0 436; CHECK-NEXT: Binding: Local (0x0) 437; CHECK-NEXT: Type: None (0x0) 438; CHECK-NEXT: Other: 0 439; CHECK-NEXT: Section: .rodata.cst8 440; CHECK-NEXT: } 441; CHECK: Symbol { 442; CHECK: Name: {{.*}}3f9d70a0 443; CHECK-NEXT: Value: 0x0 444; CHECK-NEXT: Size: 0 445; CHECK-NEXT: Binding: Local (0x0) 446; CHECK-NEXT: Type: None (0x0) 447; CHECK-NEXT: Other: 0 448; CHECK-NEXT: Section: .rodata.cst4 449; CHECK-NEXT: } 450; CHECK: Symbol { 451; CHECK: Name: {{.*}}80000000 452; CHECK-NEXT: Value: 0x4 453; CHECK-NEXT: Size: 0 454; CHECK-NEXT: Binding: Local (0x0) 455; CHECK-NEXT: Type: None (0x0) 456; CHECK-NEXT: Other: 0 457; CHECK-NEXT: Section: .rodata.cst4 458; CHECK-NEXT: } 459; CHECK: Symbol { 460; CHECK: Name: addend_ptr 461; CHECK-NEXT: Value: 0x18 462; CHECK-NEXT: Size: 4 463; CHECK-NEXT: Binding: Local (0x0) 464; CHECK-NEXT: Type: Object (0x1) 465; CHECK-NEXT: Other: 0 466; CHECK-NEXT: Section: .data 467; CHECK-NEXT: } 468; CHECK: Symbol { 469; CHECK: Name: addend_ptr_const 470; CHECK-NEXT: Value: 0x18 471; CHECK-NEXT: Size: 4 472; CHECK-NEXT: Binding: Local (0x0) 473; CHECK-NEXT: Type: Object (0x1) 474; CHECK-NEXT: Other: 0 475; CHECK-NEXT: Section: .rodata 476; CHECK-NEXT: } 477; CHECK: Symbol { 478; CHECK: Name: bytes 479; CHECK-NEXT: Value: 0x0 480; CHECK-NEXT: Size: 7 481; CHECK-NEXT: Binding: Local (0x0) 482; CHECK-NEXT: Type: Object (0x1) 483; CHECK-NEXT: Other: 0 484; CHECK-NEXT: Section: .data 485; CHECK-NEXT: } 486; CHECK: Symbol { 487; CHECK: Name: bytes_const 488; CHECK-NEXT: Value: 0x0 489; CHECK-NEXT: Size: 7 490; CHECK-NEXT: Binding: Local (0x0) 491; CHECK-NEXT: Type: Object (0x1) 492; CHECK-NEXT: Other: 0 493; CHECK-NEXT: Section: .rodata 494; CHECK-NEXT: } 495; CHECK: Symbol { 496; CHECK: Name: double_zero 497; CHECK-NEXT: Value: 0x20 498; CHECK-NEXT: Size: 8 499; CHECK-NEXT: Binding: Local 500; CHECK-NEXT: Type: Object 501; CHECK-NEXT: Other: 0 502; CHECK-NEXT: Section: .bss 503; CHECK-NEXT: } 504; CHECK: Symbol { 505; CHECK: Name: double_zero2 506; CHECK-NEXT: Value: 0x28 507; CHECK-NEXT: Size: 8 508; CHECK-NEXT: Binding: Local 509; CHECK-NEXT: Type: Object 510; CHECK-NEXT: Other: 0 511; CHECK-NEXT: Section: .bss 512; CHECK-NEXT: } 513; CHECK: Symbol { 514; CHECK: Name: double_zero_const 515; CHECK-NEXT: Value: 0x20 516; CHECK-NEXT: Size: 8 517; CHECK-NEXT: Binding: Local 518; CHECK-NEXT: Type: Object 519; CHECK-NEXT: Other: 0 520; CHECK-NEXT: Section: .rodata 521; CHECK-NEXT: } 522; CHECK: Symbol { 523; CHECK: Name: double_zero_const2 524; CHECK-NEXT: Value: 0x28 525; CHECK-NEXT: Size: 8 526; CHECK-NEXT: Binding: Local 527; CHECK-NEXT: Type: Object 528; CHECK-NEXT: Other: 0 529; CHECK-NEXT: Section: .rodata 530; CHECK-NEXT: } 531; CHECK: Symbol { 532; CHECK: Name: ptr 533; CHECK-NEXT: Value: 0x10 534; CHECK-NEXT: Size: 4 535; CHECK-NEXT: Binding: Local 536; CHECK-NEXT: Type: Object 537; CHECK-NEXT: Other: 0 538; CHECK-NEXT: Section: .data 539; CHECK-NEXT: } 540; CHECK: Symbol { 541; CHECK: Name: ptr_const 542; CHECK-NEXT: Value: 0x10 543; CHECK-NEXT: Size: 4 544; CHECK-NEXT: Binding: Local 545; CHECK-NEXT: Type: Object 546; CHECK-NEXT: Other: 0 547; CHECK-NEXT: Section: .rodata 548; CHECK-NEXT: } 549; CHECK: Symbol { 550; CHECK: Name: ptr_to_func 551; CHECK-NEXT: Value: 0x14 552; CHECK-NEXT: Size: 4 553; CHECK-NEXT: Binding: Local 554; CHECK-NEXT: Type: Object 555; CHECK-NEXT: Other: 0 556; CHECK-NEXT: Section: .data 557; CHECK-NEXT: } 558; CHECK: Symbol { 559; CHECK: Name: ptr_to_func_const 560; CHECK-NEXT: Value: 0x14 561; CHECK-NEXT: Size: 4 562; CHECK-NEXT: Binding: Local 563; CHECK-NEXT: Type: Object 564; CHECK-NEXT: Other: 0 565; CHECK-NEXT: Section: .rodata 566; CHECK-NEXT: } 567; CHECK: Symbol { 568; CHECK: Name: returnDoubleConst 569; CHECK-NEXT: Value: 0x{{[1-9A-F][0-9A-F]*}} 570; CHECK-NEXT: Size: 0 571; CHECK-NEXT: Binding: Local 572; CHECK-NEXT: Type: None 573; CHECK-NEXT: Other: 0 574; CHECK-NEXT: Section: .text 575; CHECK-NEXT: } 576; CHECK: Symbol { 577; CHECK: Name: returnFloatConst 578; This happens to be the first function, so its offset is 0 within the text. 579; CHECK-NEXT: Value: 0x0 580; CHECK-NEXT: Size: 0 581; CHECK-NEXT: Binding: Local 582; CHECK-NEXT: Type: None 583; CHECK-NEXT: Other: 0 584; CHECK-NEXT: Section: .text 585; CHECK-NEXT: } 586; CHECK: Symbol { 587; CHECK: Name: short_zero 588; CHECK-NEXT: Value: 0x0 589; CHECK-NEXT: Size: 2 590; CHECK-NEXT: Binding: Local 591; CHECK-NEXT: Type: Object 592; CHECK-NEXT: Other: 0 593; CHECK-NEXT: Section: .bss 594; CHECK-NEXT: } 595; CHECK: Symbol { 596; CHECK: Name: short_zero_const 597; CHECK-NEXT: Value: 0x1C 598; CHECK-NEXT: Size: 2 599; CHECK-NEXT: Binding: Local 600; CHECK-NEXT: Type: Object 601; CHECK-NEXT: Other: 0 602; CHECK-NEXT: Section: .rodata 603; CHECK-NEXT: } 604; CHECK: Symbol { 605; CHECK: Name: test_memcpy 606; CHECK-NEXT: Value: 0x{{[1-9A-F][0-9A-F]*}} 607; CHECK-NEXT: Size: 0 608; CHECK-NEXT: Binding: Local 609; CHECK-NEXT: Type: None 610; CHECK-NEXT: Other: 0 611; CHECK-NEXT: Section: .text 612; CHECK-NEXT: } 613; CHECK: Symbol { 614; CHECK: Name: _start 615; CHECK-NEXT: Value: 0x{{[1-9A-F][0-9A-F]*}} 616; CHECK-NEXT: Size: 0 617; CHECK-NEXT: Binding: Global 618; CHECK-NEXT: Type: Function 619; CHECK-NEXT: Other: 0 620; CHECK-NEXT: Section: .text 621; CHECK-NEXT: } 622; CHECK: Symbol { 623; CHECK: Name: external_foo 624; CHECK-NEXT: Value: 0x0 625; CHECK-NEXT: Size: 0 626; CHECK-NEXT: Binding: Global 627; CHECK-NEXT: Type: None 628; CHECK-NEXT: Other: 0 629; CHECK-NEXT: Section: Undefined 630; CHECK-NEXT: } 631; CHECK: Symbol { 632; CHECK: Name: memcpy 633; CHECK-NEXT: Value: 0x0 634; CHECK-NEXT: Size: 0 635; CHECK-NEXT: Binding: Global 636; CHECK-NEXT: Type: None 637; CHECK-NEXT: Other: 0 638; CHECK-NEXT: Section: Undefined 639; CHECK-NEXT: } 640; CHECK: Symbol { 641; CHECK: Name: memset 642; CHECK-NEXT: Value: 0x0 643; CHECK-NEXT: Size: 0 644; CHECK-NEXT: Binding: Global 645; CHECK-NEXT: Type: None 646; CHECK-NEXT: Other: 0 647; CHECK-NEXT: Section: Undefined 648; CHECK-NEXT: } 649; CHECK: ] 650