From: Rafael Espindola Date: Tue, 20 Mar 2018 15:48:00 +0000 (+0000) Subject: Set dso_local for CFConstantStringClassReference. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a590e0e06d27d1a6bc18a4cb77765ef68c825f0c;p=clang Set dso_local for CFConstantStringClassReference. This one cannot use setGVProperties since it has special logic for when it is dllimport or not. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@327993 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index 310fb8e190..307ef23dd6 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -3810,14 +3810,13 @@ CodeGenModule::GetAddrOfConstantCFString(const StringLiteral *Literal) { if (!CFConstantStringClassRef) { llvm::Type *Ty = getTypes().ConvertType(getContext().IntTy); Ty = llvm::ArrayType::get(Ty, 0); - llvm::Constant *GV = - CreateRuntimeVariable(Ty, "__CFConstantStringClassReference"); + llvm::GlobalValue *GV = cast( + CreateRuntimeVariable(Ty, "__CFConstantStringClassReference")); if (getTriple().isOSBinFormatCOFF()) { IdentifierInfo &II = getContext().Idents.get(GV->getName()); TranslationUnitDecl *TUDecl = getContext().getTranslationUnitDecl(); DeclContext *DC = TranslationUnitDecl::castToDeclContext(TUDecl); - llvm::GlobalValue *CGV = cast(GV); const VarDecl *VD = nullptr; for (const auto &Result : DC->lookup(&II)) @@ -3825,13 +3824,14 @@ CodeGenModule::GetAddrOfConstantCFString(const StringLiteral *Literal) { break; if (!VD || !VD->hasAttr()) { - CGV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass); - CGV->setLinkage(llvm::GlobalValue::ExternalLinkage); + GV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass); + GV->setLinkage(llvm::GlobalValue::ExternalLinkage); } else { - CGV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass); - CGV->setLinkage(llvm::GlobalValue::ExternalLinkage); + GV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass); + GV->setLinkage(llvm::GlobalValue::ExternalLinkage); } } + setDSOLocal(GV); // Decay array -> ptr CFConstantStringClassRef = diff --git a/test/CodeGen/cfstring-windows.c b/test/CodeGen/cfstring-windows.c index 554c4d9982..fe7511eae1 100644 --- a/test/CodeGen/cfstring-windows.c +++ b/test/CodeGen/cfstring-windows.c @@ -31,7 +31,7 @@ __declspec(dllimport) long __CFConstantStringClassReference[]; typedef struct __CFString *CFStringRef; const CFStringRef string = (CFStringRef)__builtin___CFStringMakeConstantString("string"); -// CHECK-CF-IN-CF-DECL: @__CFConstantStringClassReference = external dllexport global [0 x i32] +// CHECK-CF-IN-CF-DECL: @__CFConstantStringClassReference = external dso_local dllexport global [0 x i32] // CHECK-CF-IN-CF-DEFN: @__CFConstantStringClassReference = common dso_local dllexport global [32 x i32] // CHECK-CF: @__CFConstantStringClassReference = external dllimport global [0 x i32] // CHECK-CF-EXTERN: @__CFConstantStringClassReference = external dllimport global [0 x i32]