CodeGen: tweak CFString emission for COFF targets
The `isa' member was previously not given the correct DLL Storage. Ensure that we give the `isa' constant `__CFConstantStringClassReference' the correct DLL storage. Default to dllimport unless an explicit specification gives it a dllexport storage. llvm-svn: 271361
This commit is contained in:
parent
b326986de0
commit
4976634208
|
@ -3099,6 +3099,27 @@ CodeGenModule::GetAddrOfConstantCFString(const StringLiteral *Literal) {
|
||||||
Ty = llvm::ArrayType::get(Ty, 0);
|
Ty = llvm::ArrayType::get(Ty, 0);
|
||||||
llvm::Constant *GV =
|
llvm::Constant *GV =
|
||||||
CreateRuntimeVariable(Ty, "__CFConstantStringClassReference");
|
CreateRuntimeVariable(Ty, "__CFConstantStringClassReference");
|
||||||
|
|
||||||
|
if (getTarget().getTriple().isOSBinFormatCOFF()) {
|
||||||
|
IdentifierInfo &II = getContext().Idents.get(GV->getName());
|
||||||
|
TranslationUnitDecl *TUDecl = getContext().getTranslationUnitDecl();
|
||||||
|
DeclContext *DC = TranslationUnitDecl::castToDeclContext(TUDecl);
|
||||||
|
llvm::GlobalValue *CGV = cast<llvm::GlobalValue>(GV);
|
||||||
|
|
||||||
|
const VarDecl *VD = nullptr;
|
||||||
|
for (const auto &Result : DC->lookup(&II))
|
||||||
|
if ((VD = dyn_cast<VarDecl>(Result)))
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (!VD || !VD->hasAttr<DLLExportAttr>()) {
|
||||||
|
CGV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
|
||||||
|
CGV->setLinkage(llvm::GlobalValue::ExternalLinkage);
|
||||||
|
} else {
|
||||||
|
CGV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
|
||||||
|
CGV->setLinkage(llvm::GlobalValue::ExternalLinkage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Decay array -> ptr
|
// Decay array -> ptr
|
||||||
V = llvm::ConstantExpr::getGetElementPtr(Ty, GV, Zeros);
|
V = llvm::ConstantExpr::getGetElementPtr(Ty, GV, Zeros);
|
||||||
CFConstantStringClassRef = V;
|
CFConstantStringClassRef = V;
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
// RUN: %clang_cc1 -triple thumbv7-windows -fdeclspec -DCF_BUILDING_CF -DDECL -S -emit-llvm %s -o - | FileCheck %s -check-prefix CHECK-CF-IN-CF-DECL
|
||||||
|
// RUN: %clang_cc1 -triple thumbv7-windows -fdeclspec -DCF_BUILDING_CF -DDEFN -S -emit-llvm %s -o - | FileCheck %s -check-prefix CHECK-CF-IN-CF-DEFN
|
||||||
|
// RUN: %clang_cc1 -triple thumbv7-windows -fdeclspec -S -emit-llvm %s -o - | FileCheck %s -check-prefix CHECK-CF
|
||||||
|
// RUN: %clang_cc1 -triple thumbv7-windows -fdeclspec -DEXTERN -S -emit-llvm %s -o - | FileCheck %s -check-prefix CHECK-CF-EXTERN
|
||||||
|
// RUN: %clang_cc1 -triple thumbv7-windows -fdeclspec -DEXTERN_DLLIMPORT -S -emit-llvm %s -o - | FileCheck %s -check-prefix CHECK-CF-EXTERN-DLLIMPORT
|
||||||
|
// RUN: %clang_cc1 -triple thumbv7-windows -fdeclspec -DDLLIMPORT -S -emit-llvm %s -o - | FileCheck %s -check-prefix CHECK-CF-DLLIMPORT
|
||||||
|
|
||||||
|
// RUN: %clang_cc1 -Os -triple thumbv7-windows -fdeclspec -DCF_BUILDING_CF -DDECL -S -emit-llvm %s -o - | FileCheck %s -check-prefix CHECK-CF-IN-CF-DECL
|
||||||
|
// RUN: %clang_cc1 -Os -triple thumbv7-windows -fdeclspec -DCF_BUILDING_CF -DDEFN -S -emit-llvm %s -o - | FileCheck %s -check-prefix CHECK-CF-IN-CF-DEFN
|
||||||
|
// RUN: %clang_cc1 -Os -triple thumbv7-windows -fdeclspec -S -emit-llvm %s -o - | FileCheck %s -check-prefix CHECK-CF
|
||||||
|
// RUN: %clang_cc1 -Os -triple thumbv7-windows -fdeclspec -DEXTERN -S -emit-llvm %s -o - | FileCheck %s -check-prefix CHECK-CF-EXTERN
|
||||||
|
// RUN: %clang_cc1 -Os -triple thumbv7-windows -fdeclspec -DEXTERN_DLLIMPORT -S -emit-llvm %s -o - | FileCheck %s -check-prefix CHECK-CF-EXTERN-DLLIMPORT
|
||||||
|
// RUN: %clang_cc1 -Os -triple thumbv7-windows -fdeclspec -DDLLIMPORT -S -emit-llvm %s -o - | FileCheck %s -check-prefix CHECK-CF-DLLIMPORT
|
||||||
|
|
||||||
|
#if defined(CF_BUILDING_CF)
|
||||||
|
#if defined(DECL)
|
||||||
|
extern __declspec(dllexport) long __CFConstantStringClassReference[];
|
||||||
|
#elif defined(DEFN)
|
||||||
|
__declspec(dllexport) long __CFConstantStringClassReference[32];
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#if defined(EXTERN)
|
||||||
|
extern long __CFConstantStringClassReference[];
|
||||||
|
#elif defined(EXTERN_DLLIMPORT)
|
||||||
|
extern __declspec(dllimport) long __CFConstantStringClassReference[];
|
||||||
|
#elif defined(DLLIMPORT)
|
||||||
|
__declspec(dllimport) long __CFConstantStringClassReference[];
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
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-DEFN: @__CFConstantStringClassReference = common dllexport global [32 x i32]
|
||||||
|
// CHECK-CF: @__CFConstantStringClassReference = external dllimport global [0 x i32]
|
||||||
|
// CHECK-CF-EXTERN: @__CFConstantStringClassReference = external dllimport global [0 x i32]
|
||||||
|
// CHECK-CF-EXTERN-DLLIMPORT: @__CFConstantStringClassReference = external dllimport global [0 x i32]
|
||||||
|
// CHECK-CF-DLLIMPORT: @__CFConstantStringClassReference = external dllimport global [0 x i32]
|
||||||
|
|
Loading…
Reference in New Issue