Chromium Code Reviews| 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; |
| } |