forked from OSchip/llvm-project
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 llvm-svn: 210284
This commit is contained in:
parent
8eb1d322e2
commit
8f4f1cf778
|
@ -1988,28 +1988,6 @@ LValue CodeGenFunction::EmitObjCEncodeExprLValue(const ObjCEncodeExpr *E) {
|
|||
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::EmitPredefinedLValue(const PredefinedExpr *E) {
|
|||
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);
|
||||
}
|
||||
|
|
|
@ -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*);
|
||||
|
||||
|
|
Loading…
Reference in New Issue