diff options
author | Anton Korobeynikov <asl@math.spbu.ru> | 2008-12-26 00:52:02 +0000 |
---|---|---|
committer | Anton Korobeynikov <asl@math.spbu.ru> | 2008-12-26 00:52:02 +0000 |
commit | 2f402708e62f89fb875442802e3d3f20fc909d33 (patch) | |
tree | 2fcfe0150f9173b7238cbb09e3fd3224629d91e5 /lib/CodeGen/CodeGenModule.cpp | |
parent | 7f7bb72fd0fcfc315245e811debb507f1f55456b (diff) |
Add full dllimport / dllexport support: both sema checks and codegen.
Patch by Ilya Okonsky
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61437 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CodeGenModule.cpp')
-rw-r--r-- | lib/CodeGen/CodeGenModule.cpp | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index e83d2cd293..fc1b108b0d 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -218,17 +218,30 @@ static void SetGlobalValueAttributes(const Decl *D, // approximation of what we really want. if (!ForDefinition) { // Only a few attributes are set on declarations. - if (D->getAttr<DLLImportAttr>()) - GV->setLinkage(llvm::Function::DLLImportLinkage); + if (D->getAttr<DLLImportAttr>()) { + // The dllimport attribute is overridden by a subsequent declaration as + // dllexport. + if (!D->getAttr<DLLExportAttr>()) + // dllimport attribute can be applied only to function decls, not to + // definitions. + if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { + if (!FD->getBody()) + GV->setLinkage(llvm::Function::DLLImportLinkage); + } else + GV->setLinkage(llvm::Function::DLLImportLinkage); + } } else { if (IsInternal) { GV->setLinkage(llvm::Function::InternalLinkage); } else { - if (D->getAttr<DLLImportAttr>()) - GV->setLinkage(llvm::Function::DLLImportLinkage); - else if (D->getAttr<DLLExportAttr>()) - GV->setLinkage(llvm::Function::DLLExportLinkage); - else if (D->getAttr<WeakAttr>() || IsInline) + if (D->getAttr<DLLExportAttr>()) { + if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { + // The dllexport attribute is ignored for undefined symbols. + if (FD->getBody()) + GV->setLinkage(llvm::Function::DLLExportLinkage); + } else + GV->setLinkage(llvm::Function::DLLExportLinkage); + } else if (D->getAttr<WeakAttr>() || IsInline) GV->setLinkage(llvm::Function::WeakLinkage); } } |