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
This commit is contained in:
parent
9d2250ad43
commit
00db2f13f8
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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).
|
||||
///
|
||||
|
|
|
@ -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]) {""});
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue