From b210fc598f51ff973cf8176bd4478a068a98b2ce Mon Sep 17 00:00:00 2001 From: Eli Friedman Date: Sat, 14 Nov 2009 08:37:13 +0000 Subject: [PATCH] Make __func__ and friends work correctly within the initializer for a static local variable. llvm-svn: 88766 --- clang/lib/CodeGen/CGExprConstant.cpp | 14 ++++++++------ clang/test/CodeGen/const-init.c | 6 ++++++ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/clang/lib/CodeGen/CGExprConstant.cpp b/clang/lib/CodeGen/CGExprConstant.cpp index 644ec107e95e..b80a9416f56f 100644 --- a/clang/lib/CodeGen/CGExprConstant.cpp +++ b/clang/lib/CodeGen/CGExprConstant.cpp @@ -766,13 +766,15 @@ public: return llvm::ConstantExpr::getBitCast(C, ConvertType(E->getType())); } case Expr::PredefinedExprClass: { - // __func__/__FUNCTION__ -> "". __PRETTY_FUNCTION__ -> "top level". - std::string Str; - if (cast(E)->getIdentType() == - PredefinedExpr::PrettyFunction) - Str = "top level"; + unsigned Type = cast(E)->getIdentType(); + if (CGF) { + LValue Res = CGF->EmitPredefinedFunctionName(Type); + return cast(Res.getAddress()); + } else if (Type == PredefinedExpr::PrettyFunction) { + return CGM.GetAddrOfConstantCString("top level", ".tmp"); + } - return CGM.GetAddrOfConstantCString(Str, ".tmp"); + return CGM.GetAddrOfConstantCString("", ".tmp"); } case Expr::AddrLabelExprClass: { assert(CGF && "Invalid address of label expression outside function."); diff --git a/clang/test/CodeGen/const-init.c b/clang/test/CodeGen/const-init.c index caef3e14c07f..06cdde9c9575 100644 --- a/clang/test/CodeGen/const-init.c +++ b/clang/test/CodeGen/const-init.c @@ -117,3 +117,9 @@ struct g22 {int x;} __attribute((packed)); struct g23 {char a; short b; char c; struct g22 d;}; struct g23 g24 = {1,2,3,4}; +// CHECK: @__func__.g25 = private constant [4 x i8] c"g25\00" +// CHECK: @g25.g26 = internal global i8* getelementptr inbounds ([4 x i8]* @__func__.g25, i32 0, i32 0) +int g25() { + static const char *g26 = __func__; + return *g26; +}