[cfe-dev] Replacing constructor calls in a clang plugin; constructor not emitted

Jakub Kuderski via cfe-dev cfe-dev at lists.llvm.org
Tue Jan 17 11:08:47 PST 2017


Works like charm, thanks!

~Kuba

On 17 January 2017 at 18:13, Reid Kleckner <rnk at google.com> wrote:

> You need to mark the 2 argument constructor as ODR-used. I think you want
> to all Sema.MarkFunctionReferenced.
>
> On Tue, Jan 17, 2017 at 5:57 AM, Jakub Kuderski via cfe-dev <
> cfe-dev at lists.llvm.org> wrote:
>
>> Hi,
>>
>> I'm working on a clang plugin that would replace some constructor calls
>> with calls to other constructors.
>>
>> Here's a simplified example:
>>
>> template <typename> struct C {
>>>   C() {}
>>>   C(int, int) {}
>>> };
>>> C<void> c = {};
>>> //C<void> d = {0, 0};
>>> int main() {}
>>
>>
>> I want to call the 2-argument constructor to initialize c to make it act
>> like the initialization of the d variable below.
>>
>> I wrote a plugin that runs before the main AST action and does the
>> transformation in HandleTopLevelDecl. The problem is that the 2-argument
>> constructor is not begin emitted and linking fails.
>>
>> I'm doing the transformation this way:
>>
>>> void ChangeCtor(VarDecl *VD) {
>>>   VD->dump();
>>>   auto &Sema = Instance.getSema();
>>>   auto &Context = Sema.getASTContext();
>>>   auto Loc = VD->getSourceRange().getBegin();
>>>   auto VarQT = VD->getType();
>>>   auto *Zero = clang::IntegerLiteral::Create(Context, llvm::APInt(32,
>>> 0),
>>>                                              Context.IntTy, Loc);
>>>   auto *RDecl = VarQT->getAsCXXRecordDecl();
>>>   CXXConstructorDecl *Ctor = nullptr;
>>>   for (auto *CD : RDecl->ctors())
>>>     if (CD->getNumParams() == 2)
>>>       Ctor = CD;
>>
>>
>>>   Expr *Params[] = {Zero, Zero};
>>>   auto *ConstructExpr = CXXConstructExpr::Create(
>>>       Context, VarQT, Loc, Ctor, false, Params, true, true, false, false,
>>>       CXXConstructExpr::CK_Complete, VD->getSourceRange());
>>>
>>
>> ConstructExpr->dump();
>>>   VD->setInit(ConstructExpr);
>>>   VD->dump();
>>> }
>>
>>
>> (Here's a gist with all the code:  https://gist.github.com/kuhar
>> /fd205c2f38e1baa4331e70dd5cb45b42)
>>
>> When I uncomment the d variable, or insert a call to the 2-argument ctor
>> somewhere else, it gets emitted and links fine - no surprise here.
>>
>> What am I doing wrong? Any suggestion on how to make it work?
>>
>> Thanks,
>> ~Kuba
>>
>> _______________________________________________
>> cfe-dev mailing list
>> cfe-dev at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20170117/fe7369dd/attachment.html>


More information about the cfe-dev mailing list