Author: samsonov Date: Thu Jun 5 15:53:34 2014 New Revision: 210284 URL: http://llvm.org/viewvc/llvm-project?rev=210284&view=rev Log: Mangle predefined string constants names to merge them at link-time
Summary: This change generalizes the code used to create global LLVM variables referencing predefined strings (e.g. __FUNCTION__): now it just calls GetAddrOfConstantStringFromLiteral method. As a result, global variables for these predefined strings may get mangled names and linkonce_odr linkage. Fix the test accordingly. Test Plan: clang regression tests Reviewers: majnemer Reviewed By: majnemer Subscribers: cfe-commits Differential Revision: http://reviews.llvm.org/D4023 Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp cfe/trunk/test/CodeGenCXX/ms_wide_predefined_expr.cpp Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=210284&r1=210283&r2=210284&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CGExpr.cpp (original) +++ cfe/trunk/lib/CodeGen/CGExpr.cpp Thu Jun 5 15:53:34 2014 @@ -1988,28 +1988,6 @@ LValue CodeGenFunction::EmitObjCEncodeEx E->getType()); } -static llvm::Constant* -GetAddrOfConstantWideString(StringRef Str, - const char *GlobalName, - ASTContext &Context, - QualType Ty, SourceLocation Loc, - CodeGenModule &CGM) { - - StringLiteral *SL = StringLiteral::Create(Context, - Str, - StringLiteral::Wide, - /*Pascal = */false, - Ty, Loc); - llvm::Constant *C = CGM.GetConstantArrayFromStringLiteral(SL); - auto *GV = new llvm::GlobalVariable( - CGM.getModule(), C->getType(), !CGM.getLangOpts().WritableStrings, - llvm::GlobalValue::PrivateLinkage, C, GlobalName); - const unsigned WideAlignment = - Context.getTypeAlignInChars(Ty).getQuantity(); - GV->setAlignment(WideAlignment); - return GV; -} - static void ConvertUTF8ToWideString(unsigned CharByteWidth, StringRef Source, SmallString<32>& Target) { Target.resize(CharByteWidth * (Source.size() + 1)); @@ -2078,14 +2056,12 @@ LValue CodeGenFunction::EmitPredefinedLV if (ElemType->isWideCharType()) { SmallString<32> RawChars; ConvertUTF8ToWideString( - getContext().getTypeSizeInChars(ElemType).getQuantity(), - FunctionName, RawChars); - C = GetAddrOfConstantWideString(RawChars, - GVName.c_str(), - getContext(), - E->getType(), - E->getLocation(), - CGM); + getContext().getTypeSizeInChars(ElemType).getQuantity(), FunctionName, + RawChars); + StringLiteral *SL = StringLiteral::Create( + getContext(), RawChars, StringLiteral::Wide, + /*Pascal = */ false, E->getType(), E->getLocation()); + C = CGM.GetAddrOfConstantStringFromLiteral(SL); } else { C = CGM.GetAddrOfConstantCString(FunctionName, GVName.c_str(), 1); } Modified: cfe/trunk/test/CodeGenCXX/ms_wide_predefined_expr.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/ms_wide_predefined_expr.cpp?rev=210284&r1=210283&r2=210284&view=diff ============================================================================== --- cfe/trunk/test/CodeGenCXX/ms_wide_predefined_expr.cpp (original) +++ cfe/trunk/test/CodeGenCXX/ms_wide_predefined_expr.cpp Thu Jun 5 15:53:34 2014 @@ -1,6 +1,6 @@ // RUN: %clang_cc1 %s -fms-extensions -triple i686-pc-win32 -emit-llvm -o - | FileCheck %s -// CHECK: @"L__FUNCTION__.?func@@YAXXZ" = private constant [5 x i16] [i16 102, i16 117, i16 110, i16 99, i16 0], align 2 +// CHECK: @"\01??_C@_19DPFBEKIN@?$AAf?$AAu?$AAn?$AAc?$AA?$AA@" = linkonce_odr unnamed_addr constant [5 x i16] [i16 102, i16 117, i16 110, i16 99, i16 0], align 2 void wprint(const wchar_t*); _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
