diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2009-11-14 08:37:13 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2009-11-14 08:37:13 +0000 |
commit | f70b24e7fa15d72506534af43d4090bb37a32694 (patch) | |
tree | 41be93b1566c6bfb351487aec0bd8c39b24dac4f /lib/CodeGen/CGExprConstant.cpp | |
parent | 221c7211c507482a91e97ede1bf6cf65a456ff67 (diff) |
Make __func__ and friends work correctly within the initializer for a static
local variable.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@88766 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGExprConstant.cpp')
-rw-r--r-- | lib/CodeGen/CGExprConstant.cpp | 14 |
1 files changed, 8 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."); |