From: Daniel Dunbar Date: Fri, 17 Oct 2008 21:58:32 +0000 (+0000) Subject: Lift CodeGenFunction::EmitPredefinedFunctioName out of EmitPredefinedLValue. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=662b71ee82339c67f2c3689196e716c6560cf925;p=clang Lift CodeGenFunction::EmitPredefinedFunctioName out of EmitPredefinedLValue. - Shouldn't assume predefined expr is a function printing one. - Uses CGM functionality to cache function names per module. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@57737 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp index 872e3d1af4..34d025d289 100644 --- a/lib/CodeGen/CGExpr.cpp +++ b/lib/CodeGen/CGExpr.cpp @@ -531,21 +531,12 @@ LValue CodeGenFunction::EmitStringLiteralLValue(const StringLiteral *E) { return LValue::MakeAddr(CGM.GetAddrOfConstantStringFromLiteral(E), 0); } -LValue CodeGenFunction::EmitPredefinedLValue(const PredefinedExpr *E) { - std::string FunctionName; - if(const FunctionDecl *FD = dyn_cast(CurFuncDecl)) { - FunctionName = FD->getName(); - } else if (isa(CurFuncDecl)) { - // Just get the mangled name. - FunctionName = CurFn->getName(); - } else { - return EmitUnsupportedLValue(E, "predefined expression"); - } +LValue CodeGenFunction::EmitPredefinedFunctionName(unsigned Type) { std::string GlobalVarName; - - switch (E->getIdentType()) { + + switch (Type) { default: - return EmitUnsupportedLValue(E, "predefined expression"); + assert(0 && "Invalid type"); case PredefinedExpr::Func: GlobalVarName = "__func__."; break; @@ -557,17 +548,30 @@ LValue CodeGenFunction::EmitPredefinedLValue(const PredefinedExpr *E) { GlobalVarName = "__PRETTY_FUNCTION__."; break; } - + + std::string FunctionName; + if(const FunctionDecl *FD = dyn_cast(CurFuncDecl)) { + FunctionName = FD->getName(); + } else { + // Just get the mangled name. + FunctionName = CurFn->getName(); + } + GlobalVarName += FunctionName; - - // FIXME: Can cache/reuse these within the module. - llvm::Constant *C = llvm::ConstantArray::get(FunctionName); - - // Create a global variable for this. - C = new llvm::GlobalVariable(C->getType(), true, - llvm::GlobalValue::InternalLinkage, - C, GlobalVarName, CurFn->getParent()); - return LValue::MakeAddr(C,0); + llvm::Constant *C = + CGM.GetAddrOfConstantCString(FunctionName, GlobalVarName.c_str()); + return LValue::MakeAddr(C, 0); +} + +LValue CodeGenFunction::EmitPredefinedLValue(const PredefinedExpr *E) { + switch (E->getIdentType()) { + default: + return EmitUnsupportedLValue(E, "predefined expression"); + case PredefinedExpr::Func: + case PredefinedExpr::Function: + case PredefinedExpr::PrettyFunction: + return EmitPredefinedFunctionName(E->getIdentType()); + } } LValue CodeGenFunction::EmitArraySubscriptExpr(const ArraySubscriptExpr *E) { diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h index ca499d85e4..c0a5a44b69 100644 --- a/lib/CodeGen/CodeGenFunction.h +++ b/lib/CodeGen/CodeGenFunction.h @@ -375,6 +375,7 @@ public: LValue EmitDeclRefLValue(const DeclRefExpr *E); LValue EmitStringLiteralLValue(const StringLiteral *E); + LValue EmitPredefinedFunctionName(unsigned Type); LValue EmitPredefinedLValue(const PredefinedExpr *E); LValue EmitUnaryOpLValue(const UnaryOperator *E); LValue EmitArraySubscriptExpr(const ArraySubscriptExpr *E);