Niddodi, Chaitra via llvm-dev
2020-Oct-01 15:00 UTC
[llvm-dev] Creating a global variable for a struct array
>The type you pass to GlobalVariable's constructor for that variableshould be "[10 x %struct.dlist]" because that's what you want storage for. Then the GlobalVariable itself will be a Constant of type "[10 x %struct.dlist]*". Yes, I verified that this is the case. I enabled assertions and the error seems to occur while creating GlobalVariable for both struct dhash and struct dlist. Here is a simpler version of the code causing error: //struct dhash typedef struct dhash{ char* filenm; int n; }dhash; //create global variable to hold filename string Constant *filenmInit = ConstantDataArray::getString(M.getContext(), "myfile.txt"); Constant *filenmConst = new GlobalVariable(M, filenmInit->getType(), false, GlobalVariable::ExternalLinkage, filenmInit, ".filenm"); //create global variable for int Constant* intInit = ConstantInt::get(Type::getInt32Ty(M.getContext()), 10); Constant* intConst = new GlobalVariable(M, intInit->getType(), false, GlobalVariable::ExternalLinkage, intInit, ".int"); //create ConstantStruct for each hashtable entry Constant *dhashInit[] = {filenmConst, intConst}; Constant *dhashConst = ConstantStruct::get(dhashTy, dhashInit); Constant* htabInitArr[2]; htabInitArr[0] = dhashConst; htabInitArr[1] = dhashConst; ArrayType *htabTy = ArrayType::get(dhashTy, 2); Constant *htabInit = ConstantArray::get(htabTy, makeArrayRef(htabInitArr,2)); GlobalVariable *htabConst = new GlobalVariable(M, htabInit->getType(), false, GlobalVariable::ExternalLinkage, htabInit, "htab"); Here is the error message: opt: /home/chaitra/llvm-5-src/lib/IR/Constants.cpp:879: llvm::ConstantAggregate::ConstantAggregate(llvm::CompositeType*, llvm::Value::ValueTy, llvm::ArrayRef<llvm::Constant*>): Assertion `V[I]->getType() == T->getTypeAtIndex(I) && "Initializer for composite element doesn't match!"' failed. #0 0x0000000001e558fa (opt+0x1e558fa) #1 0x0000000001e5366e (opt+0x1e5366e) #2 0x0000000001e537e2 (opt+0x1e537e2) #3 0x00007f8a98a55390 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x11390) #4 0x00007f8a977c7438 gsignal /build/glibc-e6zv40/glibc-2.23/signal/../sysdeps/unix/sysv/linux/raise.c:54:0 #5 0x00007f8a977c903a abort /build/glibc-e6zv40/glibc-2.23/stdlib/abort.c:91:0 #6 0x00007f8a977bfbe7 __assert_fail_base /build/glibc-e6zv40/glibc-2.23/assert/assert.c:92:0 #7 0x00007f8a977bfc92 (/lib/x86_64-linux-gnu/libc.so.6+0x2dc92) #8 0x000000000189c982 (opt+0x189c982) #9 0x000000000189cc7c (opt+0x189cc7c) #10 0x00000000018a93e0 (opt+0x18a93e0) #11 0x00000000018a95f3 (opt+0x18a95f3) #12 0x00007f8a9758e59a iospecns::storage_bitcode::runOnModule(llvm::Module&) (/home/chaitra/Desktop/iospec_test/test/build/proj/libstorage_bitcode.so+0x459a) #13 0x00000000019473ad (opt+0x19473ad) #14 0x00000000006db61c (opt+0x6db61c) #15 0x00007f8a977b2840 __libc_start_main /build/glibc-e6zv40/glibc-2.23/csu/../csu/libc-start.c:325:0 #16 0x0000000000747519 (opt+0x747519) Stack dump: 0. Program arguments: opt -load /home/chaitra/Desktop/iospec_test/test/build/proj/libstorage_bitcode.so -storage_bitcode 1. Running pass 'storage_bitcode' on module '<stdin>'. Aborted (core dumped) Thanks, Chaitra -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20201001/872534bf/attachment.html>
Tim Northover via llvm-dev
2020-Oct-01 17:53 UTC
[llvm-dev] Creating a global variable for a struct array
On Thu, 1 Oct 2020 at 16:01, Niddodi, Chaitra <chaitra at illinois.edu> wrote:> //create global variable to hold filename string > Constant *filenmInit = ConstantDataArray::getString(M.getContext(), "myfile.txt"); > Constant *filenmConst = new GlobalVariable(M, filenmInit->getType(), false, > GlobalVariable::ExternalLinkage, filenmInit, ".filenm");filenmConst's LLVM type is "[12 x i8]*" (or similar if I've miscounted), but I assume the slot in the struct is i8*. So you need either a bitcast or a getelementptr constant expression to convert it. Cheers. Tim.
Niddodi, Chaitra via llvm-dev
2020-Oct-01 20:26 UTC
[llvm-dev] Creating a global variable for a struct array
The error still persists despite adding the following cast: filenmConst = ConstantExpr::getBitCast(filenmConst, Type::getInt8PtrTy(M.getContext())); That's why I had omitted this line from code earlier. Thanks, Chaitra ________________________________ From: Tim Northover <t.p.northover at gmail.com> Sent: Thursday, October 1, 2020 12:53 To: Niddodi, Chaitra Cc: llvm-dev at lists.llvm.org Subject: Re: [llvm-dev] Creating a global variable for a struct array On Thu, 1 Oct 2020 at 16:01, Niddodi, Chaitra <chaitra at illinois.edu> wrote:> //create global variable to hold filename string > Constant *filenmInit = ConstantDataArray::getString(M.getContext(), "myfile.txt"); > Constant *filenmConst = new GlobalVariable(M, filenmInit->getType(), false, > GlobalVariable::ExternalLinkage, filenmInit, ".filenm");filenmConst's LLVM type is "[12 x i8]*" (or similar if I've miscounted), but I assume the slot in the struct is i8*. So you need either a bitcast or a getelementptr constant expression to convert it. Cheers. Tim. -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20201001/229c1be0/attachment.html>
Niddodi, Chaitra via llvm-dev
2020-Oct-01 20:56 UTC
[llvm-dev] Creating a global variable for a struct array
>filenmConst's LLVM type is "[12 x i8]*" (or similar if I'vemiscounted), but I assume the slot in the struct is i8*. So you need either a bitcast or a getelementptr constant expression to convert it. The error still persists despite adding the following cast: filenmConst = ConstantExpr::getBitCast(filenmConst, Type::getInt8PtrTy(M.getContext())); That's why I had omitted this line from code earlier. Also, the same type mismatch error occurs when I try to create a GlobalVariable for a struct with 2 int fields as follows: //struct dhash typedef struct dhash{ int m; int n; }dhash; //create global variable for int Constant* intInit1 = ConstantInt::get(Type::getInt32Ty(M.getContext()), 11); Constant* intConst1 = new GlobalVariable(M, intInit1->getType(), false, GlobalVariable::ExternalLinkage, intInit1, ".int1"); //create global variable for int Constant* intInit = ConstantInt::get(Type::getInt32Ty(M.getContext()), 10); Constant* intConst = new GlobalVariable(M, intInit->getType(), false, GlobalVariable::ExternalLinkage, intInit, ".int"); //create ConstantStruct for each hashtable entry Constant *dhashInit[] = {intConst1, intConst};//{filenmConst, intConst}; Constant *dhashConst = ConstantStruct::get(dhashTy, dhashInit); Constant* htabInitArr[2]; htabInitArr[0] = dhashConst; htabInitArr[1] = dhashConst; ArrayType *htabTy = ArrayType::get(dhashTy, 2); Constant *htabInit = ConstantArray::get(htabTy, makeArrayRef(htabInitArr,2)); GlobalVariable *htabConst = new GlobalVariable(M, htabInit->getType(), false, GlobalVariable::ExternalLinkage, htabInit, "htab"); struct dhash in LLVM IR is as follows: %struct.dhash = type { i32, i32 } So, I'm not sure why the error occurs ? Thanks, Chaitra -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20201001/85251cd0/attachment.html>