LLVM。如何根据名称访问结构体字段?

2023-11-24

我有很少的 C++ 示例代码:

struct RecordTest
{
    int value1;
    int value2;
};

void test()
{
    RecordTest rt;
    rt.value1 = 15;
    rt.value2 = 75;
}

以及 LLVM 3.4 IR:

%struct.RecordTest = type { i32, i32 }

; Function Attrs: nounwind
define void @_Z4testv() #0 {
entry:
  %rt = alloca %struct.RecordTest, align 4
  %value1 = getelementptr inbounds %struct.RecordTest* %rt, i32 0, i32 0
  store i32 15, i32* %value1, align 4
  %value2 = getelementptr inbounds %struct.RecordTest* %rt, i32 0, i32 1
  store i32 75, i32* %value2, align 4
  ret void
}

一个非常简单的问题:我怎样才能访问RecordTest字段(当我解析 .cpp 时),没有索引,只有名称(value1 and value2)?

我只知道一种方法(从llc -march=cpp) - 带索引:

  AllocaInst* ptr_rt = new AllocaInst(StructTy_struct_RecordTest, "rt", label_entry);
  ptr_rt->setAlignment(4);
  std::vector<Value*> ptr_value1_indices;
  ptr_value1_indices.push_back(const_int32_6);
  ptr_value1_indices.push_back(const_int32_6);
  Instruction* ptr_value1 = GetElementPtrInst::Create(ptr_rt, ptr_value1_indices, "value1", label_entry);
  StoreInst* void_9 = new StoreInst(const_int32_7, ptr_value1, false, label_entry);
  void_9->setAlignment(4);
  std::vector<Value*> ptr_value2_indices;
  ptr_value2_indices.push_back(const_int32_6);
  ptr_value2_indices.push_back(const_int32_5);
  Instruction* ptr_value2 = GetElementPtrInst::Create(ptr_rt, ptr_value2_indices, "value2", label_entry);
  StoreInst* void_10 = new StoreInst(const_int32_8, ptr_value2, false, label_entry);
  void_10->setAlignment(4);

那么,如果我不知道字段的索引(const_int32_5 and const_int32_6在上面的代码中)?

UPD==================================

因此,我们无法访问字段名称。如果我们需要它(如果我们解析 .cpp,我们确实需要它), 我们可以这样写:

 // It can be some kind of singletone
static std::map<std::string, std::vector<std::string>> mymap;

// Some function, where we first time meet RecordTest
    std::vector<std::string> fieldNames;
    fieldNames.push_back("value1");
    fieldNames.push_back("value2");
    mymap["RecordTest"] = fieldNames;

// Some function, where we need to access to RecordTest field
    std::vector<std::string> fieldNamesAgain = mymap.find("RecordTest")->second;
    std::string fieldName = "value1";
    int idxValue1 = -1;
    for (int i = 0, e = fieldNamesAgain.size(); i < e; i++) // little ugly search
    {
        if (fieldName == fieldNamesAgain[i])
        {
                // we get field index, and now we can build code
                // as in example above (llc -march=cpp)
            idxValue1 = i;  
            break;
        }
    }

这是正确的吗 ?


您不能通过名称访问结构体的字段,只能通过索引访问。当您使用 Clang 编译时,此信息通常不存在。

有一个例外,如果您使用调试信息编译。在这种情况下,您将拥有有关该类型的充足数据;具体来说,您将获得字段的顺序,以及每个字段的元数据条目,其中包含其名称(以及其他有用的内容,例如相对于类型开头的偏移量)。

阅读有关此内容的更多信息源代码级调试指南 - 特别是,请参阅本节关于结构编码,及其非常好的例子。

看一眼调试信息.h类来帮助查询调试信息,尽管我认为无论如何你都必须进行一些手动挖掘。

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

LLVM。如何根据名称访问结构体字段? 的相关文章

随机推荐

  • 将空值排序在所有其他值之后,特殊情况除外

    我有一个带有可选排序字段的 PostgreSQL 项目表 CREATE TABLE tasks id integer PRIMARY KEY DEFAULT nextval f seq f id integer REFERENCES fix
  • Android 7 意图附加功能缺失

    有谁知道与 Android 6 0 Lollipop 相比 Android 7 0 Nougat 处理 Intent extras 的方式是否有任何变化 长话短说 我的应用程序在 4 1 16 到 6 0 23 的所有版本上都能按预期运行
  • Angular 6:HttpErrorResponse SyntaxError:JSON 中出现意外的 token

    我正在发布一个请求 我应该会收到一个 成功 字符串作为响应 我收到一个 HttpResponseError 其中包含下图中发布的以下信息 采购订单服务 postPurchaseOrderCustom purchaseOrderCustom
  • 在 PHP 中创建基于边缘检测的图像

    我很好奇 是否可以用 PHP 实现 1 发送图像文件到服务器 2 处理图像 检测边缘并根据边缘创建简单的笔画 3 将文件保存在服务器上 将其发送到用户的浏览器 其他 这是一些 示例 文件 P 如您所见 它不是使用任何启用边缘检测的程序制作的
  • GAE python 线程不并行执行

    我正在尝试在 GAE 上使用 Python 创建一个简单的 Web 应用程序 应用程序需要根据收到的请求生成一些线程 为此 我使用 python 的线程库 我生成所有线程 然后等待它们 t1 start t2 start t3 start
  • sqlalchemy 在多个列中是唯一的

    假设我有一个代表位置的类 地点 属于 客户 位置由 unicode 10 字符代码标识 位置代码 在特定客户的位置中应该是唯一的 The two below fields in combination should be unique cu
  • Odoo/OpenERP:从树视图中隐藏创建按钮

    我这里有一个情况 我正在使用 OpenERP 7 我试图从我的产品的树视图中隐藏 创建 按钮 这可以通过使用来完成
  • 隐藏的 div 高度(改变我的建议)

    好吧 我要在这里回答某人关于为什么他们的脚本不起作用的问题 他们将内容加载到隐藏的 div 中 然后获取高度 以便为包裹的 div 制作动画 但我总是尝试测试我提供的代码 所以我做了这个演示向他们证明这一点 那么 嗯 我现在是进入了暮光区还
  • 关于java字符串文字池和字符串连接的混淆

    全部 当我编写下面的代码时遇到问题 String hello Hello String str5 Hel lo String str8 Hel String str9 lo String str10 str8 str9 System out
  • 在C#中执行包含GO语句的SQL批处理

    我正在尝试构建一个程序 它可以批量执行sql语句并进行错误处理 因此我没有使用SMO 问题是GO不是 SQL 的一部分 当使用 NET 执行语句时 它最终会出现错误 SMO 会处理它 但不会给出执行是否失败的任何指示 string stat
  • 如果包含的单元格为空,则使用 jQuery 隐藏表格列

    我有一个以下类型的表 table width 500 border 1 cellspacing 0 cellpadding 0 thead tr th span 1 span th th span 2 span th th span 3 s
  • Select() 查询中使用的 Lambda 表达式

    我正在尝试构建一个 lambda 表达式 其中包含两个赋值 如下所示 然后我可以将其传递给 Queryable Select 方法 我试图将字符串变量传递到方法中 然后使用该变量构建 lambda 表达式 以便我可以在 LINQ Selec
  • 如何更新 XAMPP 的 PHP 版本 [重复]

    这个问题在这里已经有答案了 可能的重复 在 Windows 版 XAMPP 中升级 PHP 我目前使用 XAMPP 版本 1 8 1 其中 PHP 版本 5 4 3 我从一天前发布的 PHP 站点版本 5 4 11 找到了最新版本的 PHP
  • 在 Eclipse (Galileo) 中安装 Maven 插件 (m2eclipse) 时出现问题

    我已经安装了 Eclipse Galileo 适用于 Java EE 开发人员 现在我正在尝试安装 m2eclipse Maven 插件 我按照以下描述的基本步骤进行操作http m2eclipse sonatype org install
  • Django:仅更新UpdateView中已更改的字段

    我正在使用 UpdateView 来更新一系列字段 但是 我只想将已修改的字段保存到数据库中 如果在更新过程中未为字段提供值 我希望将以前的值用作默认值 如果为字段提供了新值 则只应更新该字段 我该如何实现这一目标 views py cla
  • 如何动态加载css文件

    我们正在使用Vue js and Vuetify对于我的申请 作为我的应用程序的一部分 我将根据该 API 响应在页面加载时进行 API 调用 整个应用程序将呈现所有组件 作为此 API 的一部分 我将获得名为CSS方向它告诉哪个 css
  • 在 O(n) 中找到输入字符串的最小周期?

    鉴于以下问题 定义 令 S 为字母表 上的字符串 S 是最小周期S if S 是满足以下条件的最小字符串 S S k S where S 是一个前缀S 如果没有这样的S 存在 那么S是 不是周期性的 例子 S abcabcabcabca T
  • Laravel 时间戳(来自 json 响应)与 artisan & mysql select 命令生成的时间戳不同

    TL DR 没有2020 08 09在 json 响应中 我刚刚发现我的行为很奇怪Laravel 7 x今天的项目 正如上面标题所提到的 created at and updated atjson 响应与 artisan 命令生成的响应不同
  • 比较两个数组并查找第二个数组中缺少的项目[重复]

    这个问题在这里已经有答案了 我有两个数组 它们一开始是相同的 但用户可以从第二个数组中删除 无法添加 只能删除 项目 我想查找第一个数组中但不在第二个数组中的项目 我可以想到几种方法来做到这一点 但由于这些数组可能非常大 我很好奇是否有人可
  • LLVM。如何根据名称访问结构体字段?

    我有很少的 C 示例代码 struct RecordTest int value1 int value2 void test RecordTest rt rt value1 15 rt value2 75 以及 LLVM 3 4 IR st