脚本宝典收集整理的这篇文章主要介绍了php – 使用LLVM API将全局字符串存储在可变变量中,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
这是我要编译的代码:
<?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\00" 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!\00",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 }
任何帮助赞赏.
以上是脚本宝典为你收集整理的php – 使用LLVM API将全局字符串存储在可变变量中全部内容,希望文章能够帮你解决php – 使用LLVM API将全局字符串存储在可变变量中所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。