假设我有以下简单的C头文件:
// foo1.h
typedef int foo;
typedef struct {
foo a;
char const* b;
} bar;
bar baz(foo*, bar*, ...);
Run Code Online (Sandbox Code Playgroud)
我的目标是获取此文件,并生成一个如下所示的LLVM模块:
%struct.bar = type { i32, i8* }
declare { i32, i8* } @baz(i32*, %struct.bar*, ...)
Run Code Online (Sandbox Code Playgroud)
换句话说,将.h带有声明的C 文件转换为等效的LLVM IR,包括类型分辨率,宏扩展等.
通过Clang传递它来生成LLVM IR会产生一个空模块(因为实际上没有使用任何定义):
$ clang -cc1 -S -emit-llvm foo1.h -o -
; ModuleID = 'foo1.h'
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-darwin13.3.0"
!llvm.ident = !{!0}
!0 = metadata !{metadata !"clang version 3.5 (trunk 200156) (llvm/trunk 200155)"}
Run Code Online (Sandbox Code Playgroud)
我的第一直觉是转向谷歌,我遇到了两个相关的问题:一个来自邮件列表 …