php – 使用LLVM API将全局字符串存储在可变变量中
发布时间:2020-12-13 15:57:34 所属栏目:PHP教程 来源:网络整理
导读:我正在使用LLVM和OCaml为 PHP子集编译. LLVM中字符串处理的教程有点缺乏 – 至少我找不到任何东西. 这是我要编译的代码: ?php$a = "foo"; 这是我输入的以上代码的AST: [(Typedast.Stmt Typedast.Expr (Typedast.TUnit,(opaque,Typedast.Binop ((Typedast.E
我正在使用LLVM和OCaml为
PHP子集编译. LLVM中字符串处理的教程有点缺乏 – 至少我找不到任何东西.
这是我要编译的代码: <?php $a = "foo"; 这是我输入的以上代码的AST: [(Typedast.Stmt Typedast.Expr (Typedast.TUnit,(<opaque>,Typedast.Binop ((Typedast.Eq None),Typedast.Lvar ((<opaque>,"$a"),Typedast.TString)),(Typedast.String (<opaque>,"asd"))),Typedast.TUnit))))] (< opaque>这里只是意味着没有显示pos(位置).) 这是我生成的LLVM IR: ; ModuleID = 'mymodule' @foo = private unnamed_addr constant [4 x i8] c"foo 0" define i32 @main() { entry: %"$a" = alloca i8 store i8 0,i8* %"$a" store i8* getelementptr inbounds ([4 x i8]* @foo,i32 0,i32 0),i8* %"$a" ret i32 0 } 我的错误信息: Stored value type does not match pointer operand type! store i8* getelementptr inbounds ([4 x i8]* @asd,i8* %"$a" i8LLVM ERROR: Broken module found,compilation aborted! 问题是i8 *%“$a”应该是i8 **%“$a”,如一个简单的C程序的LLVM IR所示: int main() { char* str = "Hello,world!"; puts(str); return 0; } 这将生成此LLVM IR: @.str = private unnamed_addr constant [14 x i8] c"Hello,world! 0",align 1 ; Function Attrs: nounwind uwtable define i32 @main() #0 { %1 = alloca i32,align 4 %str = alloca i8*,align 8 store i32 0,i32* %1 store i8* getelementptr inbounds ([14 x i8]* @.str,i8** %str,align 8 %2 = load i8** %str,align 8 %3 = call i32 @puts(i8* %2) ret i32 0 } 任何帮助赞赏. 解决方法
通过改变分配代码解决了(我真的希望).代替
build_alloca i8_t ... 它应该是 build_alloca (pointer_type i8_t) ... 我通过直接编辑生成的代码然后用llc编译它来调试它,看看需要改变什么. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |