2017-05-28 38 views
0

我只是想知道,我在文档 中的任何地方搜索过,但LLVM是否支持非具体类型支持LLVM中的非具体“iN”类型

通过非具体的我的意思是,直到运行时输入类似于“iN”,然后可能运行一种monomorphization pass(请参见下面的示例)以将“iN”类型具体化为“i56”,具体取决于运行时参数。

不要希望使用LLVM ORC JIT API,它可以简化所有事情,但不是我想要使用的东西。

以下是我需要应用的转换的示例场景。 (请注意,下面的语言是Im试图在LLVM中构建编译器的自定义语言)。

(可以有很多棘手的情况下,但是这是一个基本的例子场景。 我已经考虑在AST水平构建SSA形式为我定制的语言,但我想作出之前探讨在LLVM IR任何可能的选择我自己定制的SSA表格)

Before Transformation - 

(bits(datasize)) AddWithCarry(Boolean a) 
{ 
    integer datasize =if a 
        then 5; 
        else 9; 

    bits(datasize) res ; 

    return res; 

} 



(integer)main() 
{ 
     test(argv[1]); // command line argument 

} 

//=============================== 


After Transformation 

(bits(datasize)) AddWithCarry(Boolean a) 
{ 
     if a 
      then 
      bits(5) res ; 
      return res; 
     else 
      bits(9) res ; 
      return res; 


} 


(integer)main() 
{ 
     test(argv[1]); // command line argument 

} 

回答

1

编号LLVM IR是低级别的,所以所有的类型都应该是具体的。所有的高层次转换应该在前端执行。如果您需要在运行时执行更改,则需要某种类型的JIT。

+0

我知道JIT的用法,那会更简单。但是,我需要在不使用JIT的情况下执行此操作,所以我想知道是否有办法在不为我的自定义语言制作自定义SSA的情况下执行此操作... – mal

+0

对不起,我的意思是我的语言AST的自定义SSA表单。 – mal