[llvm-dev] [cfe-dev] Create a BlockAddress array from LLVM Pass

Mustakimur Rahman Khandaker (Mustakim) via llvm-dev llvm-dev at lists.llvm.org
Tue Jan 29 08:18:31 PST 2019


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>


More information about the llvm-dev mailing list