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>
Mustakimur Rahman Khandaker (Mustakim) via llvm-dev
2019-Jan-29 15:51 UTC
[llvm-dev] [cfe-dev] Create a BlockAddress array from LLVM Pass
More specifically, this is what I have right now.
unsigned int nBr = fit->second.size();
// integer pointer type
PointerType *PointerTy PointerType::get(IntegerType::get(fn->getContext(),
8), 8);
// list the BlockAddress from BasicBlock
std::vector<Constant *> listBA;
for (std::set<llvm::BasicBlock *>::iterator it = fit->second.begin();
it != fit->second.end(); ++it) {
BlockAddress *bba = BlockAddress::get(fn, *it);
listBA.push_back(bba);
}
ArrayRef<llvm::Constant *> blockArray(listBA);
// create the constant type and array
ArrayType *pArrTy = ArrayType::get(PointerTy, nBr);
Constant *blockItems = ConstantArray::get(pArrTy, blockArray);
// Global Variable Declarations
GlobalVariable *gvar_ptr_abc = new GlobalVariable(
*fn->getParent(), pArrTy, true, GlobalValue::InternalLinkage,
blockItems, "labelTracker");
gvar_ptr_abc->setAlignment(16);
And I received following message when try to disassemble the .bc.
LLVM ERROR: Type mismatch in constant table!
On Jan 29 2019, at 9:24 am, Mustakimur Rahman Khandaker (Mustakim)
<mustakcsecuet at gmail.com> wrote:> 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/355b42cf/attachment-0001.html>
Mustakimur Rahman Khandaker (Mustakim) via llvm-dev
2019-Jan-29 16:18 UTC
[llvm-dev] [cfe-dev] Create a BlockAddress array from LLVM Pass
Thanks, I have solved it with this: PointerType *intPtTy = Type::getInt8PtrTy(fn->getContext()); On Jan 29 2019, at 10:51 am, Mustakimur Rahman Khandaker (Mustakim) <mustakcsecuet at gmail.com> wrote:> More specifically, this is what I have right now. > > unsigned int nBr = fit->second.size(); > // integer pointer type > PointerType *PointerTy > PointerType::get(IntegerType::get(fn->getContext(), 8), 8); > > // list the BlockAddress from BasicBlock > std::vector<Constant *> listBA; > for (std::set<llvm::BasicBlock *>::iterator it = fit->second.begin(); > it != fit->second.end(); ++it) { > BlockAddress *bba = BlockAddress::get(fn, *it); > listBA.push_back(bba); > } > ArrayRef<llvm::Constant *> blockArray(listBA); > > // create the constant type and array > ArrayType *pArrTy = ArrayType::get(PointerTy, nBr); > Constant *blockItems = ConstantArray::get(pArrTy, blockArray); > > // Global Variable Declarations > GlobalVariable *gvar_ptr_abc = new GlobalVariable( > *fn->getParent(), pArrTy, true, GlobalValue::InternalLinkage, > blockItems, "labelTracker"); > gvar_ptr_abc->setAlignment(16); > > And I received following message when try to disassemble the .bc. > LLVM ERROR: Type mismatch in constant table! > > On Jan 29 2019, at 9:24 am, Mustakimur Rahman Khandaker (Mustakim) <mustakcsecuet at gmail.com> wrote: > > 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/b71fbc18/attachment-0001.html>