从 LLVM 模块中提取函数模板声明?
Extract Function Template Declarations from LLVM Module?
从 LLVM 模块中提取函数很简单:
for(auto FF = My_Module.begin(); FF != My_Module.end(): ++FF)
llvm::Function *F = dyn_cast<llvm::Function>(FF);
但这只给了我已经定义的函数。如果我有如下程序:
template <class T> __attribute__((noinline)) T load(T *ptr){
return *ptr;
}
int main(){
int a = 4;
int b = 5;
char c = 6;
long d = 8;
return load<int>(&a) + load<int>(&b) + load<char>(&c) + load<long>(&d);
}
因此,例如,如果我想在 load 函数声明的 IR 中为 unsigned long 创建另一个函数,我该如何提取可用于为该类型创建函数的 FunctionTemplateDecl?
这是为我想要的类型创建函数的正确方法吗?
此时的函数模板已经具体化,具体取决于用于实例化的类型。 LLVM IR 没有模板的概念;你离实际的机器代码有点远。
你需要去前端(即 Clang),因为这是 FunctionTemplateDecl
和朋友所在的地方(这意味着操纵 AST 等)。
从 LLVM 模块中提取函数很简单:
for(auto FF = My_Module.begin(); FF != My_Module.end(): ++FF)
llvm::Function *F = dyn_cast<llvm::Function>(FF);
但这只给了我已经定义的函数。如果我有如下程序:
template <class T> __attribute__((noinline)) T load(T *ptr){
return *ptr;
}
int main(){
int a = 4;
int b = 5;
char c = 6;
long d = 8;
return load<int>(&a) + load<int>(&b) + load<char>(&c) + load<long>(&d);
}
因此,例如,如果我想在 load 函数声明的 IR 中为 unsigned long 创建另一个函数,我该如何提取可用于为该类型创建函数的 FunctionTemplateDecl?
这是为我想要的类型创建函数的正确方法吗?
此时的函数模板已经具体化,具体取决于用于实例化的类型。 LLVM IR 没有模板的概念;你离实际的机器代码有点远。
你需要去前端(即 Clang),因为这是 FunctionTemplateDecl
和朋友所在的地方(这意味着操纵 AST 等)。