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>