Index: src/IceGlobalInits.h |
diff --git a/src/IceGlobalInits.h b/src/IceGlobalInits.h |
index 8f51db243f02d229ee057634a1d9b3e6e60a5246..6c82fea3ebc3923db222c2b7abce8d4cacc12532 100644 |
--- a/src/IceGlobalInits.h |
+++ b/src/IceGlobalInits.h |
@@ -92,6 +92,19 @@ protected: |
llvm::GlobalValue::LinkageTypes Linkage) |
: Kind(Kind), Linkage(Linkage) {} |
+ /// Returns true if linkage is defined correctly for the global declaration, |
+ /// based on default rules. |
+ bool verifyLinkageDefault(GlobalContext *Ctx) const { |
Jim Stichnoth
2015/10/06 20:16:21
Here and below, maybe you can use "const GlobalCon
Karl
2015/10/06 21:47:18
Done.
|
+ switch (Linkage) { |
+ default: |
+ return false; |
+ case llvm::GlobalValue::InternalLinkage: |
+ return true; |
+ case llvm::GlobalValue::ExternalLinkage: |
+ return Ctx->getFlags().getAllowExternDefinedSymbols(); |
+ } |
+ } |
+ |
const GlobalDeclarationKind Kind; |
IceString Name; |
llvm::GlobalValue::LinkageTypes Linkage; |
@@ -124,6 +137,13 @@ public: |
void dump(GlobalContext *Ctx, Ostream &Stream) const final; |
bool getSuppressMangling() const final { return isExternal() && IsProto; } |
+ /// Returns true if linkage is correct for the function declaration. |
+ bool verifyLinkageCorrect(GlobalContext *Ctx) const { |
+ if (isPNaClABIExternalName() || isIntrinsicName(Ctx)) |
+ return Linkage == llvm::GlobalValue::ExternalLinkage; |
+ return verifyLinkageDefault(Ctx); |
+ } |
+ |
private: |
const Ice::FuncSigType Signature; |
llvm::CallingConv::ID CallingConv; |
@@ -134,6 +154,18 @@ private: |
llvm::GlobalValue::LinkageTypes Linkage, bool IsProto) |
: GlobalDeclaration(FunctionDeclarationKind, Linkage), |
Signature(Signature), CallingConv(CallingConv), IsProto(IsProto) {} |
+ |
+ bool isPNaClABIExternalName() const { |
+ const char *Name = getName().c_str(); |
+ return strcmp(Name, "_start") == 0 || strcmp(Name, "__pnacl_pso_root") == 0; |
+ } |
+ |
+ bool isIntrinsicName(GlobalContext *Ctx) const { |
+ if (!hasName()) return false; |
Jim Stichnoth
2015/10/06 20:16:21
make format
Karl
2015/10/06 21:47:18
Done.
|
+ bool BadIntrinsic; |
+ return Ctx->getIntrinsicsInfo().find(getName(), BadIntrinsic) |
+ && !BadIntrinsic; |
+ } |
}; |
/// Models a global variable declaration, and its initializers. |
@@ -309,6 +341,11 @@ public: |
/// initialization). |
void dump(GlobalContext *Ctx, Ostream &Stream) const final; |
+ /// Returns true if linkage is correct for the variable declaration. |
+ bool verifyLinkageCorrect(GlobalContext *Ctx) const { |
+ return verifyLinkageDefault(Ctx); |
+ } |
+ |
static bool classof(const GlobalDeclaration *Addr) { |
return Addr->getKind() == VariableDeclarationKind; |
} |