从LLVM模块中提取功能模板声明?

时间:2018-07-19 14:40:41

标签: templates llvm llvm-clang

从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);
}

例如,如果我想在函数加载声明的IR中创建无符号长整型的另一个函数,该如何提取可用于创建该类型的函数的FunctionTemplateDecl?

这是为我想要的类型创建函数的正确方法吗?

1 个答案:

答案 0 :(得分:1)

此时的功能模板已经实现,具体取决于用于其实例化的类型。 LLVM IR没有模板概念。您仅比实际的机器代码稍远一点。

您需要进入前端(例如Clang),因为这里是FunctionTemplateDecl和朋友居住的地方(这意味着要操纵AST等)。