Pointers llvm:创建结构类型数组(指针)
我正在使用llvm(前端:C++),并试图用我的语言实现结构类型数组(结构类型指针)。我的结构如下所示:Pointers llvm:创建结构类型数组(指针),pointers,struct,llvm,Pointers,Struct,Llvm,我正在使用llvm(前端:C++),并试图用我的语言实现结构类型数组(结构类型指针)。我的结构如下所示: struct myStruct { double const *myArray; //double type array char const *myString; //string }; 以及我的结构类型数组实现代码: ... auto myString = Type::getInt8PtrTy(TheContext); auto myArray = Type:
struct myStruct {
double const *myArray; //double type array
char const *myString; //string
};
以及我的结构类型数组实现代码:
...
auto myString = Type::getInt8PtrTy(TheContext);
auto myArray = Type::getDoublePtrTy(TheContext);
auto myStruct = StructType::create(TheContext, "Struct");
myStruct->setBody({myString, myArray});
return PointerType::get(myStruct, 0);
我认为这种方式是不正确的,因为当我将数据分配给指针并试图打印数组元素时,我只得到了第一个struct数组元素和唯一的“myString”(“myArray”总是空的)。我想知道我做错了什么
附加代码:
struct myStruct* getData(){
double const arr1[3] = { 10, 7, 9 }; double const* arraypnt1 = arr1; char const *str1 = "string1";
double const arr2[3] = { 1, 2, 4}; double const* arraypnt2 = arr2; char const *str2 = "string2";
struct myStruct p[2] = {{ arraypnt1, str1 }, { arraypnt2, str2 }};
struct myStruct* pairarr = p; // array of pairs
return pairarr;
}
乍一看似乎很合理,只是你真的希望字符串被表示为指向64位整数的指针吗?你能为你觉得奇怪的东西添加额外的代码和输出吗?您发布的代码片段只显示类型构造,而不显示值构造。您是否在打印数组元素之前加载它们???@droptop是的,当然可以添加llvm ir代码来完成此操作??
//code generator
Value *ASTVarExpression::generateCode() {
Function *function = Builder.GetInsertBlock()->getParent();
Value *initValue = VariableValue->generateCode(); //this line creates call to function 'getData()'
if (!initValue) { return nullptr; }
AllocaInst *alloca = CreateFunctionEntryAlloca(function, VariableName, GetType(DeclaredType));
Builder.CreateStore(initValue, alloca); //store 'getData()' result in variable which type is 'myStructure* '
NamedValues[VariableName] = alloca;
return initValue;
}
static AllocaInst *CreateFunctionEntryAlloca(Function *function, StringRef variableName, Type* variableType) {
IRBuilder<> tempBlock(&function->getEntryBlock(), function->getEntryBlock().begin());
return tempBlock.CreateAlloca(variableType, 0, variableName);
}
Type *GetType(int expressionType){ //returns struct array type
auto myString = Type::getInt8PtrTy(TheContext);
auto myArray = Type::getDoublePtrTy(TheContext);
auto myStruct = StructType::create(TheContext, "Struct");
myStruct->setBody({myString, myArray});
return PointerType::get(myStruct, 0);
}
llvm IR code:
%varName = alloca %Struct.0*, align 8
%gencall = call %Struct* @getData()
store %Struct* %gencall, %Struct.0** %varName, align 8
ret %Struct* %gencall