Mustakimur Rahman Khandaker (Mustakim) via llvm-dev
2019-Jan-28 20:11 UTC
[llvm-dev] Create a BlockAddress array from LLVM Pass
Hi Good day. For the following function local static constant array: static const __attribute__((used)) __attribute__((section("data"))) void *codetable[] = { &&RETURN, &&INCREMENT, &&DECREMENT, &&DOUBLE, &&SWAPWORD}; I have the following in the LLVM IR. @sampleCode.codetable = internal global [5 x i8*] [i8* blockaddress(@sampleCode, %19), i8* blockaddress(@sampleCode, %22), i8* blockaddress(@sampleCode, %25), i8* blockaddress(@sampleCode, %28), i8* blockaddress(@sampleCode, %31)], section "data", align 16 Here the array elements are labels in c code. I have done following to create the same array from LLVM pass. std::vector<BlockAddress *> tmp; Function *fn = ... BasicBlock *bb = ... BlockAddress *bba = BlockAddress::get(fn, bb); tmp.push_back(bba); GlobalVariable *gvar_ptr_abc = new GlobalVariable( /*Module=*/*fn->getParent(), /*Type=*/PointerTy, /*isConstant=*/false, /*Linkage=*/GlobalValue::InternalLinkage, /*Initializer=*/0, // has initializer, specified below /*Name=*/"labelTracker"); gvar_ptr_abc->setAlignment(16); Constant *blockItems = ConstantDataArray::get(fn->getContext(), tmp); gvar_ptr_abc->setInitializer(blockItems); I get error with following: Unsupported type in Type::getScalarTy Can anyone suggest what I suppose to do? It is definitely related to my type declaration and BlockAddress items, but I don't know what it is exactly. -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190128/d49ba47e/attachment-0001.html>
Eli Friedman via llvm-dev
2019-Jan-28 20:34 UTC
[llvm-dev] [cfe-dev] Create a BlockAddress array from LLVM Pass
Please don’t send questions to both cfe-dev and llvm-dev; usually one or the other is more appropriate (in this case, it’s llvm-dev, since there’s no clang code involved). I think you meant to call ConstantArray::get, not ConstantDataArray::get. (We should probably fix ConstantDataArray::get() to use enable_if or something like that, so your example fails to compile instead of generating a weird runtime error.) -Eli From: cfe-dev <cfe-dev-bounces at lists.llvm.org> On Behalf Of Mustakimur Rahman Khandaker (Mustakim) via cfe-dev Sent: Monday, January 28, 2019 12:12 PM To: llvm-dev at lists.llvm.org; cfe-dev at lists.llvm.org Subject: [EXT] [cfe-dev] Create a BlockAddress array from LLVM Pass Hi Good day. For the following function local static constant array: static const __attribute__((used)) __attribute__((section("data"))) void *codetable[] = { &&RETURN, &&INCREMENT, &&DECREMENT, &&DOUBLE, &&SWAPWORD}; I have the following in the LLVM IR. @sampleCode.codetable = internal global [5 x i8*] [i8* blockaddress(@sampleCode, %19), i8* blockaddress(@sampleCode, %22), i8* blockaddress(@sampleCode, %25), i8* blockaddress(@sampleCode, %28), i8* blockaddress(@sampleCode, %31)], section "data", align 16 Here the array elements are labels in c code. I have done following to create the same array from LLVM pass. std::vector<BlockAddress *> tmp; Function *fn = ... BasicBlock *bb = ... BlockAddress *bba = BlockAddress::get(fn, bb); tmp.push_back(bba); GlobalVariable *gvar_ptr_abc = new GlobalVariable( /*Module=*/*fn->getParent(), /*Type=*/PointerTy, /*isConstant=*/false, /*Linkage=*/GlobalValue::InternalLinkage, /*Initializer=*/0, // has initializer, specified below /*Name=*/"labelTracker"); gvar_ptr_abc->setAlignment(16); Constant *blockItems = ConstantDataArray::get(fn->getContext(), tmp); gvar_ptr_abc->setInitializer(blockItems); I get error with following: Unsupported type in Type::getScalarTy Can anyone suggest what I suppose to do? It is definitely related to my type declaration and BlockAddress items, but I don't know what it is exactly. -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190128/d30a33f5/attachment.html>
Mustakimur Rahman Khandaker (Mustakim) via llvm-dev
2019-Jan-29 14:24 UTC
[llvm-dev] [cfe-dev] Create a BlockAddress array from LLVM Pass
Sorry for emailing both group. As I will have a constant array of BlockAddress, what type I should use in Constant Array for its ArrayType declaration? I am creating the list in following way: unsigned int nBr = fit->second.size(); llvm::Constant *listBA[nBr]; unsigned int Idx = 0; for (std::set<llvm::BasicBlock *>::iterator it = fit->second.begin(); it != fit->second.end(); ++it) { BlockAddress *bba = BlockAddress::get(fn, *it); listBA[Idx] = bba; Idx++; } Constant *blockItems ConstantArray::get(ArrayType::get(?, 8), listBA); Thanks On Jan 28 2019, at 3:34 pm, Eli Friedman <efriedma at quicinc.com> wrote:> Please don’t send questions to both cfe-dev and llvm-dev; usually one or the other is more appropriate (in this case, it’s llvm-dev, since there’s no clang code involved). > > > I think you meant to call ConstantArray::get, not ConstantDataArray::get. (We should probably fix ConstantDataArray::get() to use enable_if or something like that, so your example fails to compile instead of generating a weird runtime error.) > > -Eli > > From: cfe-dev <cfe-dev-bounces at lists.llvm.org> On Behalf Of Mustakimur Rahman Khandaker (Mustakim) via cfe-dev > Sent: Monday, January 28, 2019 12:12 PM > To: llvm-dev at lists.llvm.org; cfe-dev at lists.llvm.org > Subject: [EXT] [cfe-dev] Create a BlockAddress array from LLVM Pass > > > > Hi > > > Good day. For the following function local static constant array: > static const __attribute__((used)) > > __attribute__((section("data"))) void *codetable[] = { > > &&RETURN, &&INCREMENT, &&DECREMENT, &&DOUBLE, &&SWAPWORD}; > > I have the following in the LLVM IR. > > > > @sampleCode.codetable = internal global [5 x i8*] [i8* blockaddress(@sampleCode, %19), i8* blockaddress(@sampleCode, %22), i8* blockaddress(@sampleCode, %25), i8* blockaddress(@sampleCode, %28), i8* blockaddress(@sampleCode, %31)], section "data", align 16 > > > Here the array elements are labels in c code. I have done following to create the same array from LLVM pass. > > > > std::vector<BlockAddress *> tmp; > > Function *fn = ... > > BasicBlock *bb = ... > > > BlockAddress *bba = BlockAddress::get(fn, bb); > > tmp.push_back(bba); > > > GlobalVariable *gvar_ptr_abc = new GlobalVariable( > > /*Module=*/*fn->getParent(), > > /*Type=*/PointerTy, > > /*isConstant=*/false, > > /*Linkage=*/GlobalValue::InternalLinkage, > > /*Initializer=*/0, // has initializer, specified below > > /*Name=*/"labelTracker"); > > gvar_ptr_abc->setAlignment(16); > > Constant *blockItems = ConstantDataArray::get(fn->getContext(), tmp); > > gvar_ptr_abc->setInitializer(blockItems); > > I get error with following: Unsupported type in Type::getScalarTy > > > > Can anyone suggest what I suppose to do? It is definitely related to my type declaration and BlockAddress items, but I don't know what it is exactly.-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190129/42f5df06/attachment-0001.html>