diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-07-29 21:20:12 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-07-29 21:20:12 +0000 |
commit | 00db2f13f8be08eea489a26190e8ac9ffc2d6f4e (patch) | |
tree | 39eaa45328332bd96f3a2abbc3f8a8d490f9d9c2 /clang/lib/CodeGen/CodeGenModule.cpp | |
parent | 9d2250ad43e364114bda26807fe3074a22a07ed7 (diff) | |
download | llvm-00db2f13f8be08eea489a26190e8ac9ffc2d6f4e.zip llvm-00db2f13f8be08eea489a26190e8ac9ffc2d6f4e.tar.gz llvm-00db2f13f8be08eea489a26190e8ac9ffc2d6f4e.tar.bz2 |
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: 214222
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.cpp')
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 43 |
1 files changed, 12 insertions, 31 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; } |