美文网首页
clang简介

clang简介

作者: 李永开 | 来源:发表于2021-09-15 11:07 被阅读0次

一.llvm基本使用

查看编译过程

clang -ccc-print-phases main.m
               +- 0: input, "main.m", objective-c
            +- 1: preprocessor, {0}, objective-c-cpp-output
         +- 2: compiler, {1}, ir
      +- 3: backend, {2}, assembler
   +- 4: assembler, {3}, object
+- 5: linker, {4}, image
6: bind-arch, "x86_64", {5}, image

预处理阶段,进行头文件导入和替换

clang -E main.m >> main2.m
生成的main2.m 有7.5M
clang -E Objc1.m >> Objc1E.m
#define k_name @"ak"

@implementation Objc1
- (void)printName{
    NSLog(@"%@",k_name);
}
@end
----------------------进行了宏替换----------------------
# 1 "Objc1.m"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 379 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "Objc1.m" 2
# 10 "Objc1.m"
@implementation Objc1
- (void)printName{
    NSLog(@"%@",@"ak");
}
@end

词法分析
将源代码拆解为一个个token
因为main.m引入了AppDelegate.h,所以下文先将 @ interface AppDelegate : UIResponder <UIApplicationDelegate> 分别拆了出来,空格也算,并且表明了token的起始位置
clang -fmodules -E -Xclang -dump-tokens main.m

main.m:8:9: fatal error: 'UIKit/UIKit.h' file not found
#import <UIKit/UIKit.h>
        ^~~~~~~~~~~~~~~
at '@'   [StartOfLine]  Loc=<./AppDelegate.h:10:1>
identifier 'interface'      Loc=<./AppDelegate.h:10:2>
identifier 'AppDelegate'     [LeadingSpace] Loc=<./AppDelegate.h:10:12>
colon ':'    [LeadingSpace] Loc=<./AppDelegate.h:10:24>
identifier 'UIResponder'     [LeadingSpace] Loc=<./AppDelegate.h:10:26>
less '<'     [LeadingSpace] Loc=<./AppDelegate.h:10:38>
identifier 'UIApplicationDelegate'      Loc=<./AppDelegate.h:10:39>
greater '>'     Loc=<./AppDelegate.h:10:60>
at '@'   [StartOfLine]  Loc=<./AppDelegate.h:13:1>
identifier 'end'        Loc=<./AppDelegate.h:13:2>
int 'int'    [StartOfLine]  Loc=<main.m:11:1>
identifier 'main'    [LeadingSpace] Loc=<main.m:11:5>
l_paren '('     Loc=<main.m:11:9>
int 'int'       Loc=<main.m:11:10>
identifier 'argc'    [LeadingSpace] Loc=<main.m:11:14>
comma ','       Loc=<main.m:11:18>
char 'char'  [LeadingSpace] Loc=<main.m:11:20>
star '*'     [LeadingSpace] Loc=<main.m:11:25>
identifier 'argv'    [LeadingSpace] Loc=<main.m:11:27>
l_square '['        Loc=<main.m:11:31>
r_square ']'        Loc=<main.m:11:32>
r_paren ')'     Loc=<main.m:11:33>
l_brace '{'  [LeadingSpace] Loc=<main.m:11:35>
identifier 'NSString'    [StartOfLine] [LeadingSpace]   Loc=<main.m:12:5>
star '*'     [LeadingSpace] Loc=<main.m:12:14>
identifier 'appDelegateClassName'    [LeadingSpace] Loc=<main.m:12:16>
semi ';'        Loc=<main.m:12:36>
at '@'   [StartOfLine] [LeadingSpace]   Loc=<main.m:13:5>
identifier 'autoreleasepool'        Loc=<main.m:13:6>
l_brace '{'  [LeadingSpace] Loc=<main.m:13:22>
identifier 'appDelegateClassName'    [StartOfLine] [LeadingSpace]   Loc=<main.m:15:9>
equal '='    [LeadingSpace] Loc=<main.m:15:30>
identifier 'NSStringFromClass'   [LeadingSpace] Loc=<main.m:15:32>
l_paren '('     Loc=<main.m:15:49>
l_square '['        Loc=<main.m:15:50>
identifier 'AppDelegate'        Loc=<main.m:15:51>
identifier 'class'   [LeadingSpace] Loc=<main.m:15:63>
r_square ']'        Loc=<main.m:15:68>
r_paren ')'     Loc=<main.m:15:69>
semi ';'        Loc=<main.m:15:70>
r_brace '}'  [StartOfLine] [LeadingSpace]   Loc=<main.m:16:5>
return 'return'  [StartOfLine] [LeadingSpace]   Loc=<main.m:17:5>
identifier 'UIApplicationMain'   [LeadingSpace] Loc=<main.m:17:12>
l_paren '('     Loc=<main.m:17:29>
identifier 'argc'       Loc=<main.m:17:30>
comma ','       Loc=<main.m:17:34>
identifier 'argv'    [LeadingSpace] Loc=<main.m:17:36>
comma ','       Loc=<main.m:17:40>
identifier 'nil'     [LeadingSpace] Loc=<main.m:17:42>
comma ','       Loc=<main.m:17:45>
identifier 'appDelegateClassName'    [LeadingSpace] Loc=<main.m:17:47>
r_paren ')'     Loc=<main.m:17:67>
semi ';'        Loc=<main.m:17:68>
r_brace '}'  [StartOfLine]  Loc=<main.m:18:1>
eof ''      Loc=<main.m:18:2>
1 error generated.

语法分析,然后将所有节点组成抽象语法树AST:Abstract Syntax Tree (抽象的 语法 树)
clang -fmodules -fsyntax-only -Xclang -ast-dump main.m

main.m:8:9: fatal error: 'UIKit/UIKit.h' file not found
#import <UIKit/UIKit.h>
        ^~~~~~~~~~~~~~~
TranslationUnitDecl 0x7fae7b00ee08 <<invalid sloc>> <invalid sloc>
|-TypedefDecl 0x7fae7b00f6d8 <<invalid sloc>> <invalid sloc> implicit __int128_t '__int128'
| `-BuiltinType 0x7fae7b00f3a0 '__int128'
|-TypedefDecl 0x7fae7b00f748 <<invalid sloc>> <invalid sloc> implicit __uint128_t 'unsigned __int128'
| `-BuiltinType 0x7fae7b00f3c0 'unsigned __int128'
|-TypedefDecl 0x7fae7b00f7f0 <<invalid sloc>> <invalid sloc> implicit SEL 'SEL *'
| `-PointerType 0x7fae7b00f7a0 'SEL *'
|   `-BuiltinType 0x7fae7b00f600 'SEL'
|-TypedefDecl 0x7fae7b00f8f0 <<invalid sloc>> <invalid sloc> implicit id 'id'
| `-ObjCObjectPointerType 0x7fae7b00f890 'id'
|   `-ObjCObjectType 0x7fae7b00f850 'id'
|-TypedefDecl 0x7fae7b00f9f0 <<invalid sloc>> <invalid sloc> implicit Class 'Class'
| `-ObjCObjectPointerType 0x7fae7b00f990 'Class'
|   `-ObjCObjectType 0x7fae7b00f950 'Class'
|-ObjCInterfaceDecl 0x7fae7b00fa48 <<invalid sloc>> <invalid sloc> implicit Protocol
|-TypedefDecl 0x7fae7b050c00 <<invalid sloc>> <invalid sloc> implicit __NSConstantString 'struct __NSConstantString_tag'
| `-RecordType 0x7fae7b00fbb0 'struct __NSConstantString_tag'
|   `-Record 0x7fae7b00fb18 '__NSConstantString_tag'
|-TypedefDecl 0x7fae7b050cb0 <<invalid sloc>> <invalid sloc> implicit __builtin_ms_va_list 'char *'
| `-PointerType 0x7fae7b050c60 'char *'
|   `-BuiltinType 0x7fae7b00eea0 'char'
|-TypedefDecl 0x7fae7b050fc0 <<invalid sloc>> <invalid sloc> implicit __builtin_va_list 'struct __va_list_tag [1]'
| `-ConstantArrayType 0x7fae7b050f60 'struct __va_list_tag [1]' 1 
|   `-RecordType 0x7fae7b050da0 'struct __va_list_tag'
|     `-Record 0x7fae7b050d08 '__va_list_tag'
|-ObjCInterfaceDecl 0x7fae7b051018 <./AppDelegate.h:10:1, line:13:2> line:10:12 AppDelegate
`-FunctionDecl 0x7fae7b0513e8 <main.m:11:1, line:18:1> line:11:5 main 'int (int, char **)'
  |-ParmVarDecl 0x7fae7b051158 <col:10, col:14> col:14 used argc 'int'
  |-ParmVarDecl 0x7fae7b051298 <col:20, col:32> col:27 used argv 'char **':'char **'
  `-CompoundStmt 0x7fae7b0518a0 <col:35, line:18:1>
    `-ObjCAutoreleasePoolStmt 0x7fae7b051738 <line:13:5, line:16:5>
      `-CompoundStmt 0x7fae7b051728 <line:13:22, line:16:5>
1 error generated.

相关文章

网友评论

      本文标题:clang简介

      本文链接:https://www.haomeiwen.com/subject/gjgnrltx.html