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");
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");
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits