diff options
-rw-r--r-- | lib/CodeGen/CGExprConstant.cpp | 14 | ||||
-rw-r--r-- | test/CodeGen/const-init.c | 6 |
2 files changed, 14 insertions, 6 deletions
diff --git a/lib/CodeGen/CGExprConstant.cpp b/lib/CodeGen/CGExprConstant.cpp index 644ec107e9..b80a9416f5 100644 --- a/lib/CodeGen/CGExprConstant.cpp +++ b/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<PredefinedExpr>(E)->getIdentType() == - PredefinedExpr::PrettyFunction) - Str = "top level"; + unsigned Type = cast<PredefinedExpr>(E)->getIdentType(); + if (CGF) { + LValue Res = CGF->EmitPredefinedFunctionName(Type); + return cast<llvm::Constant>(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/test/CodeGen/const-init.c b/test/CodeGen/const-init.c index caef3e14c0..06cdde9c95 100644 --- a/test/CodeGen/const-init.c +++ b/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; +} |