[cfe-commits] r139185 - in /cfe/trunk: lib/AST/Expr.cpp lib/CodeGen/CGExpr.cpp test/CodeGenCXX/builtins.cpp
Douglas Gregor
dgregor at apple.com
Tue Sep 6 16:12:36 PDT 2011
On Sep 6, 2011, at 3:15 PM, Eli Friedman wrote:
> On Tue, Sep 6, 2011 at 2:41 PM, Douglas Gregor <dgregor at apple.com> wrote:
>> Author: dgregor
>> Date: Tue Sep 6 16:41:04 2011
>> New Revision: 139185
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=139185&view=rev
>> Log:
>> When extracting the callee declaration from a call expression, be sure
>> to look through SubstNonTypeTemplateParmExprs. Then, update the IR
>> generation of CallExprs to actually use CallExpr::getCalleeDecl()
>> rather than attempting to mimick its behavior (badly).
>>
>> Fixes <rdar://problem/10063539>.
>>
>>
>> Modified:
>> cfe/trunk/lib/AST/Expr.cpp
>> cfe/trunk/lib/CodeGen/CGExpr.cpp
>> cfe/trunk/test/CodeGenCXX/builtins.cpp
>>
>> Modified: cfe/trunk/lib/AST/Expr.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Expr.cpp?rev=139185&r1=139184&r2=139185&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/AST/Expr.cpp (original)
>> +++ cfe/trunk/lib/AST/Expr.cpp Tue Sep 6 16:41:04 2011
>> @@ -771,6 +771,12 @@
>>
>> Decl *CallExpr::getCalleeDecl() {
>> Expr *CEE = getCallee()->IgnoreParenCasts();
>> +
>> + while (SubstNonTypeTemplateParmExpr *NTTP
>> + = dyn_cast<SubstNonTypeTemplateParmExpr>(CEE)) {
>> + CEE = NTTP->getReplacement()->IgnoreParenCasts();
>> + }
>> +
>> // If we're calling a dereference, look at the pointer instead.
>> if (BinaryOperator *BO = dyn_cast<BinaryOperator>(CEE)) {
>> if (BO->isPtrMemOp())
>
> The Ignore* methods are really a mess at the moment... should some/all
> of them look through SubstNonTypeTemplateParmExpr?
It's very unclear; those Ignore* methods are a total mess. I'll take a quick pass through them to see which ones might benefit from looking through SubstNonTypeTemplateParmExpr.
>> Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=139185&r1=139184&r2=139185&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CGExpr.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGExpr.cpp Tue Sep 6 16:41:04 2011
>> @@ -2174,14 +2174,10 @@
>> if (const CXXMemberCallExpr *CE = dyn_cast<CXXMemberCallExpr>(E))
>> return EmitCXXMemberCallExpr(CE, ReturnValue);
>>
>> - const Decl *TargetDecl = 0;
>> - if (const ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(E->getCallee())) {
>> - if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CE->getSubExpr())) {
>> - TargetDecl = DRE->getDecl();
>> - if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(TargetDecl))
>> - if (unsigned builtinID = FD->getBuiltinID())
>> - return EmitBuiltinExpr(FD, builtinID, E);
>> - }
>> + const Decl *TargetDecl = E->getCalleeDecl();
>> + if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(TargetDecl)) {
>> + if (unsigned builtinID = FD->getBuiltinID())
>> + return EmitBuiltinExpr(FD, builtinID, E);
>> }
>>
>> if (const CXXOperatorCallExpr *CE = dyn_cast<CXXOperatorCallExpr>(E))
>
> Can we somehow catch cases where we end up taking the address of a
> builtin instead of calling it?
Possibly. The linker will catch them eventually; catching them in Sema is possibly useful but not a very high priority. I suggest filing a bug if you think it's important.
- Doug
More information about the cfe-commits
mailing list