加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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"foo0"

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编译它来调试它,看看需要改变什么.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读