gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:10:53 24 4
gpt4 key购买 nike

我在 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 时),没有它们的索引,只有名称( value1value2 )?

我只知道一种方式(来自 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_5const_int32_6),我可以从 C++ 转换为 LLVM IR 吗?

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 进行编译时,这些信息通常不存在。

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

Source Level Debugging 上阅读有关此内容的更多信息指南 - 特别是,参见 this section about struct encoding ,以其非常好的例子。

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

关于LLVM。如何根据名称访问结构字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17409216/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com