iOS Clang-LLVM 下,一个源文件的编译过程

编译过程

新建一个OC文件

$ touch main.m
$ open main.m 
#import <Foundation/Foundation.h>
int main (){
    NSLog(@"Hello world");
    return 0;
}
$ Esc + wq
$ clang -fmodules main.m -o main
$ ./main.m
输出:2019-05-06 17:10:43.729 main[39014:5180936] Hello world
$ clang -fmodules -fsyntax-only -Xclang -ast-dump main.m
语法结构
TranslationUnitDecl 0x7fbe6d80aae8 <<invalid sloc>> <invalid sloc>
|-TypedefDecl 0x7fbe6d80b380 <<invalid sloc>> <invalid sloc> implicit __int128_t '__int128'
| `-BuiltinType 0x7fbe6d80b080 '__int128'
|-TypedefDecl 0x7fbe6d80b3e8 <<invalid sloc>> <invalid sloc> implicit __uint128_t 'unsigned __int128'
| `-BuiltinType 0x7fbe6d80b0a0 'unsigned __int128'
|-TypedefDecl 0x7fbe6d80b480 <<invalid sloc>> <invalid sloc> implicit SEL 'SEL *'
| `-PointerType 0x7fbe6d80b440 'SEL *' imported
|   `-BuiltinType 0x7fbe6d80b2e0 'SEL'
|-TypedefDecl 0x7fbe6d80b558 <<invalid sloc>> <invalid sloc> implicit id 'id'
| `-ObjCObjectPointerType 0x7fbe6d80b500 'id' imported
|   `-ObjCObjectType 0x7fbe6d80b4d0 'id' imported
|-TypedefDecl 0x7fbe6d80b638 <<invalid sloc>> <invalid sloc> implicit Class 'Class'
| `-ObjCObjectPointerType 0x7fbe6d80b5e0 'Class' imported
|   `-ObjCObjectType 0x7fbe6d80b5b0 'Class' imported
|-ObjCInterfaceDecl 0x7fbe6d80b688 <<invalid sloc>> <invalid sloc> implicit Protocol
|-TypedefDecl 0x7fbe6c0209e8 <<invalid sloc>> <invalid sloc> implicit __NSConstantString 'struct __NSConstantString_tag'
| `-RecordType 0x7fbe6c020800 'struct __NSConstantString_tag'
|   `-Record 0x7fbe6d80b750 '__NSConstantString_tag'
|-TypedefDecl 0x7fbe6c020a80 <<invalid sloc>> <invalid sloc> implicit __builtin_ms_va_list 'char *'
| `-PointerType 0x7fbe6c020a40 'char *'
|   `-BuiltinType 0x7fbe6d80ab80 'char'
|-TypedefDecl 0x7fbe6c020d48 <<invalid sloc>> <invalid sloc> implicit __builtin_va_list 'struct __va_list_tag [1]'
| `-ConstantArrayType 0x7fbe6c020cf0 'struct __va_list_tag [1]' 1
|   `-RecordType 0x7fbe6c020b70 'struct __va_list_tag'
|     `-Record 0x7fbe6c020ad0 '__va_list_tag'
|-ImportDecl 0x7fbe6d8fb0f8 <main.m:1:1> col:1 implicit Foundation
|-FunctionDecl 0x7fbe6d8fb180 <line:2:1, line:5:1> line:2:5 main 'int ()'
| `-CompoundStmt 0x7fbe6d2c1240 <col:12, line:5:1>
|   |-CallExpr 0x7fbe6d2c11c0 <line:3:5, col:25> 'void'
|   | |-ImplicitCastExpr 0x7fbe6d2c11a8 <col:5> 'void (*)(id, ...)' <FunctionToPointerDecay>
|   | | `-DeclRefExpr 0x7fbe6d2c1090 <col:5> 'void (id, ...)' Function 0x7fbe6d8fb280 'NSLog' 'void (id, ...)'
|   | `-ImplicitCastExpr 0x7fbe6d2c11f0 <col:11, col:12> 'id':'id' <BitCast>
|   |   `-ObjCStringLiteral 0x7fbe6d2c1130 <col:11, col:12> 'NSString *'
|   |     `-StringLiteral 0x7fbe6d2c10f8 <col:12> 'char [12]' lvalue "Hello world"
|   `-ReturnStmt 0x7fbe6d2c1228 <line:4:5, col:12>

生成汇编:

$ clang -S main.m -o main.s
$ vim main.s
## @main
        .cfi_startproc
## %bb.0:
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset %rbp, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register %rbp
        subq    $16, %rsp
        leaq    L__unnamed_cfstring_(%rip), %rax
        movl    $0, -4(%rbp)
        movq    %rax, %rdi
        movb    $0, %al
        callq   _NSLog
        xorl    %eax, %eax
        addq    $16, %rsp
        popq    %rbp
        retq
        .cfi_endproc
                                        ## -- End function
        .section        __TEXT,__cstring,cstring_literals
L_.str:                                 ## @.str
        .asciz  "Hello world"

        .section        __DATA,__cfstring
        .p2align        3               ## @_unnamed_cfstring_
L__unnamed_cfstring_:
        .quad   ___CFConstantStringClassReference
        .long   1992                    ## 0x7c8
        .space  4
        .quad   L_.str
        .quad   11                      ## 0xb

        .section        __DATA,__objc_imageinfo,regular,no_dead_strip
L_OBJC_IMAGE_INFO:
        .long   0
        .long   64


.subsections_via_symbols
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容