# Source (tiny.cc): # void a() {} # void b() {} # int main(int argc, char** argv) { # void(*ptr)(); # if (argc == 1) # ptr = &a; # else # ptr = &b; # ptr(); # } # Compile with: # clang++ -g tiny.cc -S -o tiny.s .text .file "tiny.cc" .globl _Z1av # -- Begin function _Z1av .p2align 4, 0x90 .type _Z1av,@function _Z1av: # @_Z1av .Lfunc_begin0: .file 1 "tiny.cc" .loc 1 1 0 # tiny.cc:1:0 .cfi_startproc # %bb.0: pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset %rbp, -16 movq %rsp, %rbp .cfi_def_cfa_register %rbp .Ltmp0: .loc 1 1 11 prologue_end # tiny.cc:1:11 popq %rbp .cfi_def_cfa %rsp, 8 retq .Ltmp1: .Lfunc_end0: .size _Z1av, .Lfunc_end0-_Z1av .cfi_endproc # -- End function .globl _Z1bv # -- Begin function _Z1bv .p2align 4, 0x90 .type _Z1bv,@function _Z1bv: # @_Z1bv .Lfunc_begin1: .loc 1 2 0 # tiny.cc:2:0 .cfi_startproc # %bb.0: pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset %rbp, -16 movq %rsp, %rbp .cfi_def_cfa_register %rbp .Ltmp2: .loc 1 2 11 prologue_end # tiny.cc:2:11 popq %rbp .cfi_def_cfa %rsp, 8 retq .Ltmp3: .Lfunc_end1: .size _Z1bv, .Lfunc_end1-_Z1bv .cfi_endproc # -- End function .globl main # -- Begin function main .p2align 4, 0x90 .type main,@function main: # @main .Lfunc_begin2: .loc 1 4 0 # tiny.cc:4:0 .cfi_startproc # %bb.0: pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset %rbp, -16 movq %rsp, %rbp .cfi_def_cfa_register %rbp subq $32, %rsp movl $0, -4(%rbp) movl %edi, -8(%rbp) movq %rsi, -16(%rbp) .Ltmp4: .loc 1 6 12 prologue_end # tiny.cc:6:12 cmpl $1, -8(%rbp) .Ltmp5: .loc 1 6 7 is_stmt 0 # tiny.cc:6:7 jne .LBB2_2 # %bb.1: .loc 1 0 7 # tiny.cc:0:7 movabsq $_Z1av, %rax .Ltmp6: .loc 1 7 9 is_stmt 1 # tiny.cc:7:9 movq %rax, -24(%rbp) .loc 1 7 5 is_stmt 0 # tiny.cc:7:5 jmp .LBB2_3 .LBB2_2: .loc 1 0 5 # tiny.cc:0:5 movabsq $_Z1bv, %rax .loc 1 9 9 is_stmt 1 # tiny.cc:9:9 movq %rax, -24(%rbp) .Ltmp7: .LBB2_3: .loc 1 11 3 # tiny.cc:11:3 callq *-24(%rbp) .loc 1 12 1 # tiny.cc:12:1 movl -4(%rbp), %eax addq $32, %rsp popq %rbp .cfi_def_cfa %rsp, 8 retq .Ltmp8: .Lfunc_end2: .size main, .Lfunc_end2-main .cfi_endproc # -- End function .section .debug_str,"MS",@progbits,1 .Linfo_string0: .asciz "clang version 6.0.0 (trunk 317104)" # string offset=0 .Linfo_string1: .asciz "tiny.cc" # string offset=35 .Linfo_string2: .asciz "/tmp/a/b" # string offset=43 .Linfo_string3: .asciz "_Z1av" # string offset=52 .Linfo_string4: .asciz "a" # string offset=58 .Linfo_string5: .asciz "_Z1bv" # string offset=60 .Linfo_string6: .asciz "b" # string offset=66 .Linfo_string7: .asciz "main" # string offset=68 .Linfo_string8: .asciz "int" # string offset=73 .Linfo_string9: .asciz "argc" # string offset=77 .Linfo_string10: .asciz "argv" # string offset=82 .Linfo_string11: .asciz "char" # string offset=87 .Linfo_string12: .asciz "ptr" # string offset=92 .section .debug_abbrev,"",@progbits .byte 1 # Abbreviation Code .byte 17 # DW_TAG_compile_unit .byte 1 # DW_CHILDREN_yes .byte 37 # DW_AT_producer .byte 14 # DW_FORM_strp .byte 19 # DW_AT_language .byte 5 # DW_FORM_data2 .byte 3 # DW_AT_name .byte 14 # DW_FORM_strp .byte 16 # DW_AT_stmt_list .byte 23 # DW_FORM_sec_offset .byte 27 # DW_AT_comp_dir .byte 14 # DW_FORM_strp .ascii "\264B" # DW_AT_GNU_pubnames .byte 25 # DW_FORM_flag_present .byte 17 # DW_AT_low_pc .byte 1 # DW_FORM_addr .byte 18 # DW_AT_high_pc .byte 6 # DW_FORM_data4 .byte 0 # EOM(1) .byte 0 # EOM(2) .byte 2 # Abbreviation Code .byte 46 # DW_TAG_subprogram .byte 0 # DW_CHILDREN_no .byte 17 # DW_AT_low_pc .byte 1 # DW_FORM_addr .byte 18 # DW_AT_high_pc .byte 6 # DW_FORM_data4 .byte 64 # DW_AT_frame_base .byte 24 # DW_FORM_exprloc .byte 110 # DW_AT_linkage_name .byte 14 # DW_FORM_strp .byte 3 # DW_AT_name .byte 14 # DW_FORM_strp .byte 58 # DW_AT_decl_file .byte 11 # DW_FORM_data1 .byte 59 # DW_AT_decl_line .byte 11 # DW_FORM_data1 .byte 63 # DW_AT_external .byte 25 # DW_FORM_flag_present .byte 0 # EOM(1) .byte 0 # EOM(2) .byte 3 # Abbreviation Code .byte 46 # DW_TAG_subprogram .byte 1 # DW_CHILDREN_yes .byte 17 # DW_AT_low_pc .byte 1 # DW_FORM_addr .byte 18 # DW_AT_high_pc .byte 6 # DW_FORM_data4 .byte 64 # DW_AT_frame_base .byte 24 # DW_FORM_exprloc .byte 3 # DW_AT_name .byte 14 # DW_FORM_strp .byte 58 # DW_AT_decl_file .byte 11 # DW_FORM_data1 .byte 59 # DW_AT_decl_line .byte 11 # DW_FORM_data1 .byte 73 # DW_AT_type .byte 19 # DW_FORM_ref4 .byte 63 # DW_AT_external .byte 25 # DW_FORM_flag_present .byte 0 # EOM(1) .byte 0 # EOM(2) .byte 4 # Abbreviation Code .byte 5 # DW_TAG_formal_parameter .byte 0 # DW_CHILDREN_no .byte 2 # DW_AT_location .byte 24 # DW_FORM_exprloc .byte 3 # DW_AT_name .byte 14 # DW_FORM_strp .byte 58 # DW_AT_decl_file .byte 11 # DW_FORM_data1 .byte 59 # DW_AT_decl_line .byte 11 # DW_FORM_data1 .byte 73 # DW_AT_type .byte 19 # DW_FORM_ref4 .byte 0 # EOM(1) .byte 0 # EOM(2) .byte 5 # Abbreviation Code .byte 52 # DW_TAG_variable .byte 0 # DW_CHILDREN_no .byte 2 # DW_AT_location .byte 24 # DW_FORM_exprloc .byte 3 # DW_AT_name .byte 14 # DW_FORM_strp .byte 58 # DW_AT_decl_file .byte 11 # DW_FORM_data1 .byte 59 # DW_AT_decl_line .byte 11 # DW_FORM_data1 .byte 73 # DW_AT_type .byte 19 # DW_FORM_ref4 .byte 0 # EOM(1) .byte 0 # EOM(2) .byte 6 # Abbreviation Code .byte 36 # DW_TAG_base_type .byte 0 # DW_CHILDREN_no .byte 3 # DW_AT_name .byte 14 # DW_FORM_strp .byte 62 # DW_AT_encoding .byte 11 # DW_FORM_data1 .byte 11 # DW_AT_byte_size .byte 11 # DW_FORM_data1 .byte 0 # EOM(1) .byte 0 # EOM(2) .byte 7 # Abbreviation Code .byte 15 # DW_TAG_pointer_type .byte 0 # DW_CHILDREN_no .byte 73 # DW_AT_type .byte 19 # DW_FORM_ref4 .byte 0 # EOM(1) .byte 0 # EOM(2) .byte 8 # Abbreviation Code .byte 21 # DW_TAG_subroutine_type .byte 0 # DW_CHILDREN_no .byte 0 # EOM(1) .byte 0 # EOM(2) .byte 0 # EOM(3) .section .debug_info,"",@progbits .Lcu_begin0: .long 187 # Length of Unit .short 4 # DWARF version number .long .debug_abbrev # Offset Into Abbrev. Section .byte 8 # Address Size (in bytes) .byte 1 # Abbrev [1] 0xb:0xb4 DW_TAG_compile_unit .long .Linfo_string0 # DW_AT_producer .short 4 # DW_AT_language .long .Linfo_string1 # DW_AT_name .long .Lline_table_start0 # DW_AT_stmt_list .long .Linfo_string2 # DW_AT_comp_dir # DW_AT_GNU_pubnames .quad .Lfunc_begin0 # DW_AT_low_pc .long .Lfunc_end2-.Lfunc_begin0 # DW_AT_high_pc .byte 2 # Abbrev [2] 0x2a:0x19 DW_TAG_subprogram .quad .Lfunc_begin0 # DW_AT_low_pc .long .Lfunc_end0-.Lfunc_begin0 # DW_AT_high_pc .byte 1 # DW_AT_frame_base .byte 86 .long .Linfo_string3 # DW_AT_linkage_name .long .Linfo_string4 # DW_AT_name .byte 1 # DW_AT_decl_file .byte 1 # DW_AT_decl_line # DW_AT_external .byte 2 # Abbrev [2] 0x43:0x19 DW_TAG_subprogram .quad .Lfunc_begin1 # DW_AT_low_pc .long .Lfunc_end1-.Lfunc_begin1 # DW_AT_high_pc .byte 1 # DW_AT_frame_base .byte 86 .long .Linfo_string5 # DW_AT_linkage_name .long .Linfo_string6 # DW_AT_name .byte 1 # DW_AT_decl_file .byte 2 # DW_AT_decl_line # DW_AT_external .byte 3 # Abbrev [3] 0x5c:0x44 DW_TAG_subprogram .quad .Lfunc_begin2 # DW_AT_low_pc .long .Lfunc_end2-.Lfunc_begin2 # DW_AT_high_pc .byte 1 # DW_AT_frame_base .byte 86 .long .Linfo_string7 # DW_AT_name .byte 1 # DW_AT_decl_file .byte 4 # DW_AT_decl_line .long 160 # DW_AT_type # DW_AT_external .byte 4 # Abbrev [4] 0x75:0xe DW_TAG_formal_parameter .byte 2 # DW_AT_location .byte 145 .byte 120 .long .Linfo_string9 # DW_AT_name .byte 1 # DW_AT_decl_file .byte 4 # DW_AT_decl_line .long 160 # DW_AT_type .byte 4 # Abbrev [4] 0x83:0xe DW_TAG_formal_parameter .byte 2 # DW_AT_location .byte 145 .byte 112 .long .Linfo_string10 # DW_AT_name .byte 1 # DW_AT_decl_file .byte 4 # DW_AT_decl_line .long 167 # DW_AT_type .byte 5 # Abbrev [5] 0x91:0xe DW_TAG_variable .byte 2 # DW_AT_location .byte 145 .byte 104 .long .Linfo_string12 # DW_AT_name .byte 1 # DW_AT_decl_file .byte 5 # DW_AT_decl_line .long 184 # DW_AT_type .byte 0 # End Of Children Mark .byte 6 # Abbrev [6] 0xa0:0x7 DW_TAG_base_type .long .Linfo_string8 # DW_AT_name .byte 5 # DW_AT_encoding .byte 4 # DW_AT_byte_size .byte 7 # Abbrev [7] 0xa7:0x5 DW_TAG_pointer_type .long 172 # DW_AT_type .byte 7 # Abbrev [7] 0xac:0x5 DW_TAG_pointer_type .long 177 # DW_AT_type .byte 6 # Abbrev [6] 0xb1:0x7 DW_TAG_base_type .long .Linfo_string11 # DW_AT_name .byte 6 # DW_AT_encoding .byte 1 # DW_AT_byte_size .byte 7 # Abbrev [7] 0xb8:0x5 DW_TAG_pointer_type .long 189 # DW_AT_type .byte 8 # Abbrev [8] 0xbd:0x1 DW_TAG_subroutine_type .byte 0 # End Of Children Mark .section .debug_ranges,"",@progbits .section .debug_macinfo,"",@progbits .Lcu_macro_begin0: .byte 0 # End Of Macro List Mark .section .debug_pubnames,"",@progbits .long .LpubNames_end0-.LpubNames_begin0 # Length of Public Names Info .LpubNames_begin0: .short 2 # DWARF Version .long .Lcu_begin0 # Offset of Compilation Unit Info .long 191 # Compilation Unit Length .long 42 # DIE offset .asciz "a" # External Name .long 67 # DIE offset .asciz "b" # External Name .long 92 # DIE offset .asciz "main" # External Name .long 0 # End Mark .LpubNames_end0: .section .debug_pubtypes,"",@progbits .long .LpubTypes_end0-.LpubTypes_begin0 # Length of Public Types Info .LpubTypes_begin0: .short 2 # DWARF Version .long .Lcu_begin0 # Offset of Compilation Unit Info .long 191 # Compilation Unit Length .long 160 # DIE offset .asciz "int" # External Name .long 177 # DIE offset .asciz "char" # External Name .long 0 # End Mark .LpubTypes_end0: .ident "clang version 6.0.0 (trunk 317104)" .section ".note.GNU-stack","",@progbits .section .debug_line,"",@progbits .Lline_table_start0: