[PATCH] D156482: [clang][CGExprConstant] handle FunctionToPointerDecay
efriedma added inline comments. Comment at: clang/lib/CodeGen/CGExprConstant.cpp:1128 +case CK_NoOp: +case CK_NonAtomicToAtomic: return Visit(subExpr, destType); I think I'd prefer to continue treating an undecayed function as an "lvalue", to keep things straightforward. To that end, I'd prefer a separate "ConstLValueExprEmitter", or something like that, so ConstExprEmitter only visits rvalues. The new emitter should reuse code from ConstLValueExprEmitter where possible. Comment at: clang/lib/CodeGen/CGExprConstant.cpp:1247 +if (isa(VD)) + return CGM.getModule().getNamedValue(VD->getName()); +return nullptr; You 100% can't use `VD->getName()` like this; I'm shocked this isn't causing any test failures. GetAddrOfFunction() resolves names correctly. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D156482/new/ https://reviews.llvm.org/D156482 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D156482: [clang][CGExprConstant] handle FunctionToPointerDecay
shafik added a comment. Makes sense but I want @efriedma to look at as well. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D156482/new/ https://reviews.llvm.org/D156482 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D156482: [clang][CGExprConstant] handle FunctionToPointerDecay
nickdesaulniers updated this revision to Diff 544909. nickdesaulniers added a comment. - update Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D156482/new/ 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,13 @@ return llvm::ConstantInt::get(CGM.getLLVMContext(), I->getValue()); } + llvm::Constant *VisitDeclRefExpr(DeclRefExpr *D, QualType T) { +ValueDecl *VD = D->getDecl(); +if (isa(VD)) + return CGM.getModule().getNamedValue(VD->getName()); +return nullptr; + } + 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,13 @@ return llvm::ConstantInt::get(CGM.getLLVMContext(), I->getValue()); } + llvm::Constant *VisitDeclRefExpr(DeclRefExpr *D, QualType T) { +ValueDecl *VD = D->getDecl(); +if (isa(VD)) + return CGM.getModule().getNamedValue(VD->getName()); +return nullptr; + } + 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
[PATCH] D156482: [clang][CGExprConstant] handle FunctionToPointerDecay
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 col:6 used foo 'void (void)' | `-CompoundStmt 0x561e9cf12818 `-VarDecl 0x561e9cf12958 col:8 bar 'void (*)(void)' cinit `-ImplicitCastExpr 0x561e9cf129e0 'void (*)(void)' `-DeclRefExpr 0x561e9cf129c0 '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(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(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(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(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(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(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