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 =
|
auto Alignment =
|
||||||
getContext().getAlignOfGlobalVarInChars(S->getType()).getQuantity();
|
getContext().getAlignOfGlobalVarInChars(S->getType()).getQuantity();
|
||||||
|
|
||||||
llvm::StringMapEntry<llvm::GlobalVariable *> *Entry = nullptr;
|
llvm::Constant *C = GetConstantArrayFromStringLiteral(S);
|
||||||
|
llvm::GlobalVariable **Entry = nullptr;
|
||||||
if (!LangOpts.WritableStrings) {
|
if (!LangOpts.WritableStrings) {
|
||||||
Entry = getConstantStringMapEntry(S->getBytes(), S->getCharByteWidth());
|
Entry = &ConstantStringMap[C];
|
||||||
if (auto GV = Entry->getValue()) {
|
if (auto GV = *Entry) {
|
||||||
if (Alignment > GV->getAlignment())
|
if (Alignment > GV->getAlignment())
|
||||||
GV->setAlignment(Alignment);
|
GV->setAlignment(Alignment);
|
||||||
return GV;
|
return GV;
|
||||||
|
@ -2803,10 +2804,9 @@ CodeGenModule::GetAddrOfConstantStringFromLiteral(const StringLiteral *S) {
|
||||||
GlobalVariableName = ".str";
|
GlobalVariableName = ".str";
|
||||||
}
|
}
|
||||||
|
|
||||||
llvm::Constant *C = GetConstantArrayFromStringLiteral(S);
|
|
||||||
auto GV = GenerateStringLiteral(C, LT, *this, GlobalVariableName, Alignment);
|
auto GV = GenerateStringLiteral(C, LT, *this, GlobalVariableName, Alignment);
|
||||||
if (Entry)
|
if (Entry)
|
||||||
Entry->setValue(GV);
|
*Entry = GV;
|
||||||
|
|
||||||
reportGlobalToASan(GV, S->getStrTokenLoc(0), "<string literal>");
|
reportGlobalToASan(GV, S->getStrTokenLoc(0), "<string literal>");
|
||||||
return GV;
|
return GV;
|
||||||
|
@ -2822,26 +2822,6 @@ CodeGenModule::GetAddrOfConstantStringFromObjCEncode(const ObjCEncodeExpr *E) {
|
||||||
return GetAddrOfConstantCString(Str);
|
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
|
/// GetAddrOfConstantCString - Returns a pointer to a character array containing
|
||||||
/// the literal and a terminating '\0' character.
|
/// the literal and a terminating '\0' character.
|
||||||
/// The result has pointer to array type.
|
/// The result has pointer to array type.
|
||||||
|
@ -2854,19 +2834,20 @@ llvm::GlobalVariable *CodeGenModule::GetAddrOfConstantCString(
|
||||||
.getQuantity();
|
.getQuantity();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
llvm::Constant *C =
|
||||||
|
llvm::ConstantDataArray::getString(getLLVMContext(), StrWithNull, false);
|
||||||
|
|
||||||
// Don't share any string literals if strings aren't constant.
|
// Don't share any string literals if strings aren't constant.
|
||||||
llvm::StringMapEntry<llvm::GlobalVariable *> *Entry = nullptr;
|
llvm::GlobalVariable **Entry = nullptr;
|
||||||
if (!LangOpts.WritableStrings) {
|
if (!LangOpts.WritableStrings) {
|
||||||
Entry = getConstantStringMapEntry(StrWithNull, 1);
|
Entry = &ConstantStringMap[C];
|
||||||
if (auto GV = Entry->getValue()) {
|
if (auto GV = *Entry) {
|
||||||
if (Alignment > GV->getAlignment())
|
if (Alignment > GV->getAlignment())
|
||||||
GV->setAlignment(Alignment);
|
GV->setAlignment(Alignment);
|
||||||
return GV;
|
return GV;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
llvm::Constant *C =
|
|
||||||
llvm::ConstantDataArray::getString(getLLVMContext(), StrWithNull, false);
|
|
||||||
// Get the default prefix if a name wasn't specified.
|
// Get the default prefix if a name wasn't specified.
|
||||||
if (!GlobalName)
|
if (!GlobalName)
|
||||||
GlobalName = ".str";
|
GlobalName = ".str";
|
||||||
|
@ -2874,7 +2855,7 @@ llvm::GlobalVariable *CodeGenModule::GetAddrOfConstantCString(
|
||||||
auto GV = GenerateStringLiteral(C, llvm::GlobalValue::PrivateLinkage, *this,
|
auto GV = GenerateStringLiteral(C, llvm::GlobalValue::PrivateLinkage, *this,
|
||||||
GlobalName, Alignment);
|
GlobalName, Alignment);
|
||||||
if (Entry)
|
if (Entry)
|
||||||
Entry->setValue(GV);
|
*Entry = GV;
|
||||||
return GV;
|
return GV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -361,9 +361,7 @@ class CodeGenModule : public CodeGenTypeCache {
|
||||||
|
|
||||||
llvm::StringMap<llvm::Constant*> CFConstantStringMap;
|
llvm::StringMap<llvm::Constant*> CFConstantStringMap;
|
||||||
|
|
||||||
llvm::StringMap<llvm::GlobalVariable *> Constant1ByteStringMap;
|
llvm::DenseMap<llvm::Constant *, llvm::GlobalVariable *> ConstantStringMap;
|
||||||
llvm::StringMap<llvm::GlobalVariable *> Constant2ByteStringMap;
|
|
||||||
llvm::StringMap<llvm::GlobalVariable *> Constant4ByteStringMap;
|
|
||||||
llvm::DenseMap<const Decl*, llvm::Constant *> StaticLocalDeclMap;
|
llvm::DenseMap<const Decl*, llvm::Constant *> StaticLocalDeclMap;
|
||||||
llvm::DenseMap<const Decl*, llvm::GlobalVariable*> StaticLocalDeclGuardMap;
|
llvm::DenseMap<const Decl*, llvm::GlobalVariable*> StaticLocalDeclGuardMap;
|
||||||
llvm::DenseMap<const Expr*, llvm::Constant *> MaterializedGlobalTemporaryMap;
|
llvm::DenseMap<const Expr*, llvm::Constant *> MaterializedGlobalTemporaryMap;
|
||||||
|
@ -1044,9 +1042,6 @@ private:
|
||||||
llvm::PointerType *PTy,
|
llvm::PointerType *PTy,
|
||||||
const VarDecl *D);
|
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,
|
/// Set attributes which are common to any form of a global definition (alias,
|
||||||
/// Objective-C method, function, global variable).
|
/// Objective-C method, function, global variable).
|
||||||
///
|
///
|
||||||
|
|
|
@ -132,3 +132,11 @@ void test13(int x) {
|
||||||
// CHECK: @test13
|
// CHECK: @test13
|
||||||
// CHECK: and i16 {{.*}}, -1024
|
// 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