一.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.
网友评论