diff options
author | Bill Wendling <isanbard@gmail.com> | 2014-08-04 18:33:13 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2014-08-04 18:33:13 +0000 |
commit | 12646940aa41979565e09e4636d972164bbdb6d0 (patch) | |
tree | 2760fbf1c9d62ea6ee82cec91bb949f944b215f8 /clang | |
parent | fe62b2b0a70901fd6ae0f9d2c0bc85a8520282a8 (diff) | |
download | llvm-12646940aa41979565e09e4636d972164bbdb6d0.zip llvm-12646940aa41979565e09e4636d972164bbdb6d0.tar.gz llvm-12646940aa41979565e09e4636d972164bbdb6d0.tar.bz2 |
Merging r214222:
------------------------------------------------------------------------
r214222 | rsmith | 2014-07-29 14:20:12 -0700 (Tue, 29 Jul 2014) | 4 lines
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.
------------------------------------------------------------------------
llvm-svn: 214745
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 43 | ||||
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.h | 7 | ||||
-rw-r--r-- | clang/test/CodeGen/init.c | 8 |
3 files changed, 21 insertions, 37 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index bd7acf9..48823be 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -2773,10 +2773,11 @@ CodeGenModule::GetAddrOfConstantStringFromLiteral(const StringLiteral *S) { auto Alignment = getContext().getAlignOfGlobalVarInChars(S->getType()).getQuantity(); - llvm::StringMapEntry<llvm::GlobalVariable *> *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), "<string literal>"); return GV; @@ -2822,26 +2822,6 @@ CodeGenModule::GetAddrOfConstantStringFromObjCEncode(const ObjCEncodeExpr *E) { return GetAddrOfConstantCString(Str); } - -llvm::StringMapEntry<llvm::GlobalVariable *> *CodeGenModule::getConstantStringMapEntry( - StringRef Str, int CharByteWidth) { - llvm::StringMap<llvm::GlobalVariable *> *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<llvm::GlobalVariable *> *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/clang/lib/CodeGen/CodeGenModule.h b/clang/lib/CodeGen/CodeGenModule.h index 44597bf..9533a8d 100644 --- a/clang/lib/CodeGen/CodeGenModule.h +++ b/clang/lib/CodeGen/CodeGenModule.h @@ -361,9 +361,7 @@ class CodeGenModule : public CodeGenTypeCache { llvm::StringMap<llvm::Constant*> CFConstantStringMap; - llvm::StringMap<llvm::GlobalVariable *> Constant1ByteStringMap; - llvm::StringMap<llvm::GlobalVariable *> Constant2ByteStringMap; - llvm::StringMap<llvm::GlobalVariable *> Constant4ByteStringMap; + llvm::DenseMap<llvm::Constant *, llvm::GlobalVariable *> ConstantStringMap; llvm::DenseMap<const Decl*, llvm::Constant *> StaticLocalDeclMap; llvm::DenseMap<const Decl*, llvm::GlobalVariable*> StaticLocalDeclGuardMap; llvm::DenseMap<const Expr*, llvm::Constant *> MaterializedGlobalTemporaryMap; @@ -1044,9 +1042,6 @@ private: llvm::PointerType *PTy, const VarDecl *D); - llvm::StringMapEntry<llvm::GlobalVariable *> * - 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/clang/test/CodeGen/init.c b/clang/test/CodeGen/init.c index 1b0beae..b396c3b 100644 --- a/clang/test/CodeGen/init.c +++ b/clang/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]) {""}); +} |