[PATCH] D156482: [clang][CGExprConstant] handle FunctionToPointerDecay
Nick Desaulniers via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Jul 27 13:34:56 PDT 2023
nickdesaulniers created this revision.
Herald added a project: All.
nickdesaulniers requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
Consider the following code:
void foo (void) {}
void (*bar)(void) = foo;
And the corresponding AST:
|-FunctionDecl 0x561e9cf12728 <x.c:14:1, col:18> col:6 used foo 'void (void)'
| `-CompoundStmt 0x561e9cf12818 <col:17, col:18>
`-VarDecl 0x561e9cf12958 <line:15:1, col:21> col:8 bar 'void (*)(void)' cinit
`-ImplicitCastExpr 0x561e9cf129e0 <col:21> 'void (*)(void)' <FunctionToPointerDecay>
`-DeclRefExpr 0x561e9cf129c0 <col:21> 'void (void)' Function 0x561e9cf12728 'foo' 'void (void)'
The ImplicitCastExpr of FunctionToPointerDecay is obviously const.
Lookup the corresponding llvm::Function in the Module by name.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D156482
Files:
clang/lib/CodeGen/CGExprConstant.cpp
Index: clang/lib/CodeGen/CGExprConstant.cpp
===================================================================
--- clang/lib/CodeGen/CGExprConstant.cpp
+++ clang/lib/CodeGen/CGExprConstant.cpp
@@ -1122,9 +1122,10 @@
}
case CK_AtomicToNonAtomic:
- case CK_NonAtomicToAtomic:
- case CK_NoOp:
case CK_ConstructorConversion:
+ case CK_FunctionToPointerDecay:
+ case CK_NoOp:
+ case CK_NonAtomicToAtomic:
return Visit(subExpr, destType);
case CK_ArrayToPointerDecay:
@@ -1189,7 +1190,6 @@
case CK_CPointerToObjCPointerCast:
case CK_BlockPointerToObjCPointerCast:
case CK_AnyPointerToBlockPointerCast:
- case CK_FunctionToPointerDecay:
case CK_BaseToDerived:
case CK_DerivedToBase:
case CK_UncheckedDerivedToBase:
@@ -1241,6 +1241,26 @@
return llvm::ConstantInt::get(CGM.getLLVMContext(), I->getValue());
}
+ llvm::Constant *VisitDeclRefExpr(DeclRefExpr *D, QualType T) {
+ //llvm::dbgs() << __func__ << "\n";
+ //D->dump();
+ //VD->dump();
+ ValueDecl *VD = D->getDecl();
+ if (isa<FunctionDecl>(VD)) {
+ return CGM.getModule().getNamedValue(VD->getName());
+ //llvm::Module &M = CGM.getModule();
+ //llvm::GlobalValue *GV = M.getNamedValue(VD->getName());
+ //return GV;
+ }
+ //D->getSubExpr()->dump();
+ //llvm::dbgs() << isa<llvm::Function>(D) << "\n";
+ //llvm::GlobalValue *GV = CGM.getModule().getNamedValue(D->getName());
+ return nullptr;
+ //return nullptr;
+ //llvm::Value *V = Emitter.CGF->EmitDeclRefLValue(D).getPointer(*Emitter.CGF);
+ //return dyn_cast_or_null<llvm::Constant>(V);
+ }
+
llvm::Constant *EmitArrayInitialization(InitListExpr *ILE, QualType T) {
auto *CAT = CGM.getContext().getAsConstantArrayType(ILE->getType());
assert(CAT && "can't emit array init for non-constant-bound array");
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D156482.544908.patch
Type: text/x-patch
Size: 1873 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230727/4e8f92ee/attachment.bin>
More information about the cfe-commits
mailing list