使用 LLVM 创建本地字符串

2024-01-02

我正在尝试使用 LLVM 创建一个局部变量来存储字符串,但我的代码当前抛出语法错误。

lli: test2.ll:8:23: error: constant expression type mismatch
  %1 = load [6 x i8]* c"hello\00"

我分配和存储字符串的 IR 代码:

@.string = private constant [4 x i8] c"%s\0A\00"

define void @main() {
entry:
  %a = alloca [255 x i8]
  %0 = bitcast [255 x i8]* %a to i8*
  %1 = load [6 x i8]* c"hello\00"
  %2 = bitcast [6 x i8]* %1 to i8*
  %3 = tail call i8* @strncpy(i8* %0, i8* %2, i64 255) nounwind
  %4 = getelementptr inbounds [6 x i8]* %a, i32 0, i32 0
  %5 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x     i8]* @.string, i32 0, i32 0), i8* %4)
  ret void
}

declare i32 @printf(i8*, ...)
declare i8* @strncpy(i8*, i8* nocapture, i64) nounwind

使用 llc 我可以看到 llvm 实现的方式是分配和分配给全局变量,但我希望它是本地的(在基本块内)。下面的代码可以工作,但我不想创建这个 var“@.str”...

@str = global [1024 x i8] zeroinitializer, align 16
@.str = private unnamed_addr constant [6 x i8] c"hello\00", align 1
@.string = private constant [4 x i8] c"%s\0A\00"

define i32 @main() nounwind uwtable {
  %1 = tail call i8* @strncpy(i8* getelementptr inbounds ([1024 x i8]*     @str, i64 0, i64 0), i8* getelementptr inbounds ([6 x i8]* @.str,     i64 0, i64 0), i64 1024) nounwind
  %2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.string, i32 0, i32 0), i8* %1)
  ret i32 0
}

declare i8* @strncpy(i8*, i8* nocapture, i64) nounwind
declare i32 @printf(i8*, ...) #2

Thanks


在对以前的代码进行了更多修改后,我自己弄清楚了。

下面是代码,有和我一样问题的朋友可以看看

@.string = private constant [4 x i8] c"%s\0A\00"

define void @main() {
entry:
  %a = alloca [6 x i8]
  store [6 x i8] [i8 104,i8 101,i8 108,i8 108, i8 111, i8 0], [6 x i8]* %a
  %0 = bitcast [6 x i8]* %a to i8*
  %1 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.string, i32 0, i32 0), i8* %0)
  ret void
}

declare i32 @printf(i8*, ...)

基本上,我必须将每个字符单独存储在数组中,然后按位转换为 i8*,以便我可以使用 printf 函数。我无法使用c" ... "LLVM网页中显示的方法http://llvm.org/docs/LangRef.html#id669 http://llvm.org/docs/LangRef.html#id669。这似乎是 IR 语言规范中的一个特例,并且它们需要处于全局范围内。

UPDATE:我再次处理相同的代码,我发现最好的方法是存储一个常量而不是每个 i8 符号。因此第 6 行将替换为:

  store [6 x i8] c"hello\00", [6 x i8]* %0

使用llvm生成代码更容易并且更具可读性!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 LLVM 创建本地字符串 的相关文章

随机推荐

  • Node Express 中间件在一次调用中输出 console.log() 两次?

    只是一个关于某些 Node Express 中间件的简单问题 该中间件在我的节点 cmd 提示符中输出 1 个对 console log 的调用两次 它只是没有意义 想知道是否有人可以解释为什么这种情况发生在我身上 服务器 js var e
  • C# 表单控件移动

    是否有办法控制可以移动表单的位置 因此 如果我移动表单 它只能在垂直轴上移动 当我尝试水平移动它时 什么也不会发生 我不想要一个有缺陷的实现 比如位置更改或移动事件并将其内联弹出 我没有办法使用 WndProc 覆盖之类的东西 但搜索了一段
  • 为什么 C# 4.0 允许匿名对象初始化代码中的尾随逗号? [复制]

    这个问题在这里已经有答案了 可能的重复 内联属性初始化和尾随逗号 https stackoverflow com questions 5245152 inline property initialisation and trailing c
  • 如何根据给定的计数动态添加单选按钮?

    我已经尝试过这段代码 当模拟器启动时 它将在一行中显示三个单选按钮 但我需要一个按钮事件 IE 如果我单击该按钮 它应该询问单选按钮的数量 那么如果我给出计数 它必须根据给定的计数显示单选按钮 例如 如果我将计数指定为 3 则它必须在一行中
  • 为类模板声明用户定义的 OpenMP 缩减

    使用 OpenMP 时 我想为类模板声明用户定义的缩减 include
  • 如何在 Prometheus 或 Grafana 上编写“或”逻辑运算符

    我需要编写一个使用我定义的任何不同作业的查询 job traefik OR job cadvisor OR job prometheus 是否可以编写逻辑二元运算符 普罗米修斯有一个or逻辑二元运算符 但您在这里问的是向量选择器 您可以为此
  • 当 UserControl 更改可见性时聚焦于 TextBox

    我在画布内加载了一个用户控件 默认情况下 此用户控件的可见性已折叠 当我的窗口的特定文本框聚焦时 用户控件变得可见 当用户控件变得可见时 我想将焦点设置到用户控件内的另一个文本框 我尝试这样做 private void UserContro
  • 从 USRP N210 设备检索数据

    N210 连接到 RF 前端 该前端使用 GNU Radio Companion 进行配置 我可以通过 FFT 图看到信号 我需要接收到的信号 usrp2 输出 作为数字 usrp sense spectrum py 也将功率和噪声地板输出
  • 即使有 0 个连接,Aws Aurora Serverless v2 也不会缩减至 0.5 ACU

    我正在运行一个 v2 实例 并且根据 aws 文档 您应该只为实际使用的资源付费 我有一个实例 大多数时候连接数为 0 但它永远不会缩减到 2 个 ACU 以下 请参阅下面的图片以供参考 我的实例设置在 0 5 16ACU 之间扩展 但负载
  • 如何更改使用“rails new”命令创建的默认 gemfile?

    我最近遇到一个问题 我必须将以下内容添加到我的 gemfile 中 gem execjs gem therubyracer 我必须这样做以避免启动 Rails 服务器时发生 JavaScript 运行时错误 我希望将此修改添加到使用 Rai
  • 评估具有许多未知因素的项目

    我正在开展一个具有许多未知因素的项目 例如将应用程序从一个平台移动到另一个平台 我最初的估计有很大偏差 我无法真正确定这一切何时结束 我该如何处理无法评估这样的项目的情况 这并不是说我要在屏幕上添加一个按钮或设计一个网站 或创建应用程序 甚
  • run()方法后线程继续运行

    我在游戏中播放声音时遇到问题 当处理声音播放的线程退出它的 run 方法时 它不会终止 结束 停止 我知道正是这种方法导致了问题 因为当我将整个事情注释掉时 就不会创建更多线程了 用 JVisualVM 检查 问题是退出 run 方法后线程
  • 在 UWP 应用程序上使用 VB.net 获取 IPGlobalProperties

    我正在 Visual Studio 2017 中使用 VB 编写一个非常简单的通用 Windows 应用程序 该应用程序应该向用户提供基本的网络信息 因此我想使用以下方式收集数据IPGlobalProperties并打印 作为第一个例子 D
  • 如何将种子数据放入SQL Server docker镜像中?

    我有一个使用 ASP NET Core 和 SQL Server 的项目 我正在尝试将所有内容放入 docker 容器中 对于我的应用程序 我需要在数据库中有一些初始数据 我可以使用来自 microsoft microsoft mssql
  • 如何在react-native中实现刮刮卡/视图?

    我正在寻找一个包来在反应本机中实现刮刮卡 我找到了这个图书馆https github com thebylito react native scratch card https github com thebylito react nati
  • 我可以在云函数中以管理员身份使用通配符查询 firestore 吗?

    exports updateRelatedCards functions firestore document topic newTopic onWrite snap context gt const newTopic snap data
  • 联合中的标量成员是否计入公共初始序列?

    In the union U下面 如果a or b是活动成员 是否定义了访问行为c struct A int a struct B int a double b union U A a B b int c In 类 联盟 https tim
  • Materialise 中的 Roboto 字体在 Firefox 中的显示问题

    我在用物化 http materializecss com设计我的一些网页的样式 我注意到 Roboto 字体在 Firefox v43 0 3 中无法正确呈现 但在 Chrome 中看起来不错 两个浏览器都从我的服务器下载 woff2 字
  • 访问查询会自动被截断吗?

    以前可能有人问过这个问题 但我似乎无法在任何地方找到任何相关答案 几周前 我在 Access 2003 中编写了几个长查询 我今天想使用这些查询 发现它们被截断了 查询按其应有的方式开始 并在中间的某个地方显示AS Alias 其余的都不见
  • 使用 LLVM 创建本地字符串

    我正在尝试使用 LLVM 创建一个局部变量来存储字符串 但我的代码当前抛出语法错误 lli test2 ll 8 23 error constant expression type mismatch 1 load 6 x i8 c hell