Pointers llvm:创建结构类型数组(指针)

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:

我正在使用llvm(前端:C++),并试图用我的语言实现结构类型数组(结构类型指针)。我的结构如下所示:

  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