diff options
author | Timur Iskhodzhanov <timurrrr@google.com> | 2014-03-24 10:31:09 +0000 |
---|---|---|
committer | Timur Iskhodzhanov <timurrrr@google.com> | 2014-03-24 10:31:09 +0000 |
commit | 89f588ff73d15d9caaf3923f008d4fb1fa5031ac (patch) | |
tree | 2a35555ee891a6526c00d592b075267858ecb8f3 /clang/lib/CodeGen/CodeGenModule.cpp | |
parent | 276fefb8d945ec1d5027506a07672238db8f0207 (diff) | |
download | bcm5719-llvm-89f588ff73d15d9caaf3923f008d4fb1fa5031ac.tar.gz bcm5719-llvm-89f588ff73d15d9caaf3923f008d4fb1fa5031ac.zip |
Revert r204562,204566,204586,204587 as they broke ASan on Windows
llvm-svn: 204596
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.cpp')
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 74 |
1 files changed, 18 insertions, 56 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index e5a0fa56447..53e7d56a8d9 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -2572,63 +2572,25 @@ CodeGenModule::GetConstantArrayFromStringLiteral(const StringLiteral *E) { llvm::Constant * CodeGenModule::GetAddrOfConstantStringFromLiteral(const StringLiteral *S) { CharUnits Align = getContext().getAlignOfGlobalVarInChars(S->getType()); - - llvm::StringMapEntry<llvm::GlobalVariable *> *Entry = nullptr; - llvm::GlobalVariable *GV = nullptr; - if (!LangOpts.WritableStrings) { - llvm::StringMap<llvm::GlobalVariable *> *ConstantStringMap = nullptr; - switch (S->getCharByteWidth()) { - case 1: - ConstantStringMap = &Constant1ByteStringMap; - break; - case 2: - ConstantStringMap = &Constant2ByteStringMap; - break; - case 4: - ConstantStringMap = &Constant4ByteStringMap; - break; - default: - llvm_unreachable("unhandled byte width!"); - } - Entry = &ConstantStringMap->GetOrCreateValue(S->getBytes()); - GV = Entry->getValue(); - } - - if (!GV) { - SmallString<256> MangledNameBuffer; - StringRef GlobalVariableName; - llvm::GlobalValue::LinkageTypes LT; - if (!LangOpts.WritableStrings && - getCXXABI().getMangleContext().shouldMangleStringLiteral(S)) { - llvm::raw_svector_ostream Out(MangledNameBuffer); - getCXXABI().getMangleContext().mangleStringLiteral(S, Out); - Out.flush(); - - LT = llvm::GlobalValue::LinkOnceODRLinkage; - GlobalVariableName = MangledNameBuffer; - } else { - LT = llvm::GlobalValue::PrivateLinkage;; - GlobalVariableName = ".str"; - } - - // OpenCL v1.2 s6.5.3: a string literal is in the constant address space. - unsigned AddrSpace = 0; - if (getLangOpts().OpenCL) - AddrSpace = getContext().getTargetAddressSpace(LangAS::opencl_constant); - - llvm::Constant *C = GetConstantArrayFromStringLiteral(S); - GV = new llvm::GlobalVariable( - getModule(), C->getType(), !LangOpts.WritableStrings, LT, C, - GlobalVariableName, /*InsertBefore=*/nullptr, - llvm::GlobalVariable::NotThreadLocal, AddrSpace); - GV->setUnnamedAddr(true); - if (Entry) - Entry->setValue(GV); + if (S->isAscii() || S->isUTF8()) { + SmallString<64> Str(S->getString()); + + // Resize the string to the right size, which is indicated by its type. + const ConstantArrayType *CAT = Context.getAsConstantArrayType(S->getType()); + Str.resize(CAT->getSize().getZExtValue()); + return GetAddrOfConstantString(Str, /*GlobalName*/ 0, Align.getQuantity()); } - if (Align.getQuantity() > GV->getAlignment()) - GV->setAlignment(Align.getQuantity()); + // FIXME: the following does not memoize wide strings. + llvm::Constant *C = GetConstantArrayFromStringLiteral(S); + llvm::GlobalVariable *GV = + new llvm::GlobalVariable(getModule(),C->getType(), + !LangOpts.WritableStrings, + llvm::GlobalValue::PrivateLinkage, + C,".str"); + GV->setAlignment(Align.getQuantity()); + GV->setUnnamedAddr(true); return GV; } @@ -2653,7 +2615,7 @@ static llvm::GlobalVariable *GenerateStringLiteral(StringRef str, llvm::Constant *C = llvm::ConstantDataArray::getString(CGM.getLLVMContext(), str, false); - // OpenCL v1.2 s6.5.3: a string literal is in the constant address space. + // OpenCL v1.1 s6.5.3: a string literal is in the constant address space. unsigned AddrSpace = 0; if (CGM.getLangOpts().OpenCL) AddrSpace = CGM.getContext().getTargetAddressSpace(LangAS::opencl_constant); @@ -2692,7 +2654,7 @@ llvm::Constant *CodeGenModule::GetAddrOfConstantString(StringRef Str, return GenerateStringLiteral(Str, false, *this, GlobalName, Alignment); llvm::StringMapEntry<llvm::GlobalVariable *> &Entry = - Constant1ByteStringMap.GetOrCreateValue(Str); + ConstantStringMap.GetOrCreateValue(Str); if (llvm::GlobalVariable *GV = Entry.getValue()) { if (Alignment > GV->getAlignment()) { |