From f8d1c718d00326522a2a9d8097b66e62b315e320 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Tue, 29 Jul 2014 21:20:12 +0000 Subject: [PATCH] PR20473: Don't "deduplicate" string literals with the same value but different lengths! In passing, simplify string literal deduplication by relying on LLVM to deduplicate the underlying constant values. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@214222 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CodeGenModule.cpp | 43 ++++++++++------------------------- lib/CodeGen/CodeGenModule.h | 7 +----- test/CodeGen/init.c | 8 +++++++ 3 files changed, 21 insertions(+), 37 deletions(-) diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index bd7acf9d1a..48823befcc 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -2773,10 +2773,11 @@ CodeGenModule::GetAddrOfConstantStringFromLiteral(const StringLiteral *S) { auto Alignment = getContext().getAlignOfGlobalVarInChars(S->getType()).getQuantity(); - llvm::StringMapEntry *Entry = nullptr; + llvm::Constant *C = GetConstantArrayFromStringLiteral(S); + llvm::GlobalVariable **Entry = nullptr; if (!LangOpts.WritableStrings) { - Entry = getConstantStringMapEntry(S->getBytes(), S->getCharByteWidth()); - if (auto GV = Entry->getValue()) { + Entry = &ConstantStringMap[C]; + if (auto GV = *Entry) { if (Alignment > GV->getAlignment()) GV->setAlignment(Alignment); return GV; @@ -2803,10 +2804,9 @@ CodeGenModule::GetAddrOfConstantStringFromLiteral(const StringLiteral *S) { GlobalVariableName = ".str"; } - llvm::Constant *C = GetConstantArrayFromStringLiteral(S); auto GV = GenerateStringLiteral(C, LT, *this, GlobalVariableName, Alignment); if (Entry) - Entry->setValue(GV); + *Entry = GV; reportGlobalToASan(GV, S->getStrTokenLoc(0), ""); return GV; @@ -2822,26 +2822,6 @@ CodeGenModule::GetAddrOfConstantStringFromObjCEncode(const ObjCEncodeExpr *E) { return GetAddrOfConstantCString(Str); } - -llvm::StringMapEntry *CodeGenModule::getConstantStringMapEntry( - StringRef Str, int CharByteWidth) { - llvm::StringMap *ConstantStringMap = nullptr; - switch (CharByteWidth) { - case 1: - ConstantStringMap = &Constant1ByteStringMap; - break; - case 2: - ConstantStringMap = &Constant2ByteStringMap; - break; - case 4: - ConstantStringMap = &Constant4ByteStringMap; - break; - default: - llvm_unreachable("unhandled byte width!"); - } - return &ConstantStringMap->GetOrCreateValue(Str); -} - /// GetAddrOfConstantCString - Returns a pointer to a character array containing /// the literal and a terminating '\0' character. /// The result has pointer to array type. @@ -2854,19 +2834,20 @@ llvm::GlobalVariable *CodeGenModule::GetAddrOfConstantCString( .getQuantity(); } + llvm::Constant *C = + llvm::ConstantDataArray::getString(getLLVMContext(), StrWithNull, false); + // Don't share any string literals if strings aren't constant. - llvm::StringMapEntry *Entry = nullptr; + llvm::GlobalVariable **Entry = nullptr; if (!LangOpts.WritableStrings) { - Entry = getConstantStringMapEntry(StrWithNull, 1); - if (auto GV = Entry->getValue()) { + Entry = &ConstantStringMap[C]; + if (auto GV = *Entry) { if (Alignment > GV->getAlignment()) GV->setAlignment(Alignment); return GV; } } - llvm::Constant *C = - llvm::ConstantDataArray::getString(getLLVMContext(), StrWithNull, false); // Get the default prefix if a name wasn't specified. if (!GlobalName) GlobalName = ".str"; @@ -2874,7 +2855,7 @@ llvm::GlobalVariable *CodeGenModule::GetAddrOfConstantCString( auto GV = GenerateStringLiteral(C, llvm::GlobalValue::PrivateLinkage, *this, GlobalName, Alignment); if (Entry) - Entry->setValue(GV); + *Entry = GV; return GV; } diff --git a/lib/CodeGen/CodeGenModule.h b/lib/CodeGen/CodeGenModule.h index 44597bfaa9..9533a8dabb 100644 --- a/lib/CodeGen/CodeGenModule.h +++ b/lib/CodeGen/CodeGenModule.h @@ -361,9 +361,7 @@ class CodeGenModule : public CodeGenTypeCache { llvm::StringMap CFConstantStringMap; - llvm::StringMap Constant1ByteStringMap; - llvm::StringMap Constant2ByteStringMap; - llvm::StringMap Constant4ByteStringMap; + llvm::DenseMap ConstantStringMap; llvm::DenseMap StaticLocalDeclMap; llvm::DenseMap StaticLocalDeclGuardMap; llvm::DenseMap MaterializedGlobalTemporaryMap; @@ -1044,9 +1042,6 @@ private: llvm::PointerType *PTy, const VarDecl *D); - llvm::StringMapEntry * - getConstantStringMapEntry(StringRef Str, int CharByteWidth); - /// Set attributes which are common to any form of a global definition (alias, /// Objective-C method, function, global variable). /// diff --git a/test/CodeGen/init.c b/test/CodeGen/init.c index 1b0beaea60..b396c3be62 100644 --- a/test/CodeGen/init.c +++ b/test/CodeGen/init.c @@ -132,3 +132,11 @@ void test13(int x) { // CHECK: @test13 // CHECK: and i16 {{.*}}, -1024 } + +// CHECK-LABEL: @PR20473 +void PR20473() { + // CHECK: memcpy{{.*}}([2 x i8]* @ + bar((char[2]) {""}); + // CHECK: memcpy{{.*}}([3 x i8]* @ + bar((char[3]) {""}); +} -- 2.40.0