summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CodeGenModule.cpp
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-01-13 02:25:00 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-01-13 02:25:00 +0000
commitdec798bf376cfd9b7544c7d1477c5d7b4f6d5890 (patch)
tree953114f444c40ad5d79aa5481f44d5cc475a5e22 /clang/lib/CodeGen/CodeGenModule.cpp
parentcff637a568540d3847ae037b2a5279d043b17080 (diff)
downloadbcm5719-llvm-dec798bf376cfd9b7544c7d1477c5d7b4f6d5890.tar.gz
bcm5719-llvm-dec798bf376cfd9b7544c7d1477c5d7b4f6d5890.zip
Bug fix, __private_extern__ globals were always introducing a definition.
llvm-svn: 62139
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.cpp')
-rw-r--r--clang/lib/CodeGen/CodeGenModule.cpp41
1 files changed, 31 insertions, 10 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index ff8acde9951..39611a08deb 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -150,14 +150,14 @@ static void setGlobalVisibility(llvm::GlobalValue *GV,
/// AddGlobalCtor - Add a function to the list that will be called before
/// main() runs.
void CodeGenModule::AddGlobalCtor(llvm::Function * Ctor, int Priority) {
- // TODO: Type coercion of void()* types.
+ // FIXME: Type coercion of void()* types.
GlobalCtors.push_back(std::make_pair(Ctor, Priority));
}
/// AddGlobalDtor - Add a function to the list that will be called
/// when the module is unloaded.
void CodeGenModule::AddGlobalDtor(llvm::Function * Dtor, int Priority) {
- // TODO: Type coercion of void()* types.
+ // FIXME: Type coercion of void()* types.
GlobalDtors.push_back(std::make_pair(Dtor, Priority));
}
@@ -214,7 +214,7 @@ static void SetGlobalValueAttributes(const Decl *D,
bool IsInline,
llvm::GlobalValue *GV,
bool ForDefinition) {
- // TODO: Set up linkage and many other things. Note, this is a simple
+ // FIXME: Set up linkage and many other things. Note, this is a simple
// approximation of what we really want.
if (!ForDefinition) {
// Only a few attributes are set on declarations.
@@ -247,6 +247,8 @@ static void SetGlobalValueAttributes(const Decl *D,
}
}
+ // FIXME: Figure out the relative priority of the attribute,
+ // -fvisibility, and private_extern.
if (const VisibilityAttr *attr = D->getAttr<VisibilityAttr>())
setGlobalVisibility(GV, attr->getVisibility());
// FIXME: else handle -fvisibility
@@ -451,7 +453,9 @@ void CodeGenModule::EmitGlobal(const ValueDecl *Global) {
} else if (const VarDecl *VD = cast<VarDecl>(Global)) {
assert(VD->isFileVarDecl() && "Cannot emit local var decl as global.");
- isDef = !(VD->getStorageClass() == VarDecl::Extern && VD->getInit() == 0);
+ isDef = !((VD->getStorageClass() == VarDecl::Extern ||
+ VD->getStorageClass() == VarDecl::PrivateExtern) &&
+ VD->getInit() == 0);
isStatic = VD->getStorageClass() == VarDecl::Static;
} else {
assert(0 && "Invalid argument to EmitGlobal");
@@ -492,11 +496,24 @@ void CodeGenModule::EmitGlobalDefinition(const ValueDecl *D) {
// Lookup the entry, lazily creating it if necessary.
llvm::GlobalValue *&Entry = GlobalDeclMap[D->getIdentifier()];
- if (!Entry)
- Entry = new llvm::GlobalVariable(Ty, false,
- llvm::GlobalValue::ExternalLinkage,
- 0, D->getNameAsString(), &getModule(), 0,
- ASTTy.getAddressSpace());
+ if (!Entry) {
+ llvm::GlobalVariable *GV =
+ new llvm::GlobalVariable(Ty, false,
+ llvm::GlobalValue::ExternalLinkage,
+ 0, D->getNameAsString(), &getModule(), 0,
+ ASTTy.getAddressSpace());
+ Entry = GV;
+
+ // Handle things which are present even on external declarations.
+
+ // FIXME: This code is overly simple and should be merged with
+ // other global handling.
+
+ GV->setConstant(D->getType().isConstant(Context));
+
+ if (D->getStorageClass() == VarDecl::PrivateExtern)
+ setGlobalVisibility(GV, VisibilityAttr::HiddenVisibility);
+ }
// Make sure the result is of the correct type.
return llvm::ConstantExpr::getBitCast(Entry, PTy);
@@ -626,8 +643,12 @@ void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) {
GV->setLinkage(llvm::GlobalVariable::ExternalLinkage);
break;
case VarDecl::Extern:
+ // FIXME: common
+ break;
+
case VarDecl::PrivateExtern:
- // todo: common
+ GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
+ // FIXME: common
break;
}
}
OpenPOWER on IntegriCloud