Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 //===- subzero/src/IceGlobalInits.h - Global declarations -------*- C++ -*-===// | 1 //===- subzero/src/IceGlobalInits.h - Global declarations -------*- C++ -*-===// |
| 2 // | 2 // |
| 3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
| 4 // | 4 // |
| 5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
| 7 // | 7 // |
| 8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
| 9 /// | 9 /// |
| 10 /// \file | 10 /// \file |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 85 /// that relocations across pnacl-sz and pnacl-llc will work). | 85 /// that relocations across pnacl-sz and pnacl-llc will work). |
| 86 virtual IceString mangleName(GlobalContext *Ctx) const { | 86 virtual IceString mangleName(GlobalContext *Ctx) const { |
| 87 return getSuppressMangling() ? Name : Ctx->mangleName(Name); | 87 return getSuppressMangling() ? Name : Ctx->mangleName(Name); |
| 88 } | 88 } |
| 89 | 89 |
| 90 protected: | 90 protected: |
| 91 GlobalDeclaration(GlobalDeclarationKind Kind, | 91 GlobalDeclaration(GlobalDeclarationKind Kind, |
| 92 llvm::GlobalValue::LinkageTypes Linkage) | 92 llvm::GlobalValue::LinkageTypes Linkage) |
| 93 : Kind(Kind), Linkage(Linkage) {} | 93 : Kind(Kind), Linkage(Linkage) {} |
| 94 | 94 |
| 95 /// Returns true if linkage is defined correctly for the global declaration, | |
| 96 /// based on default rules. | |
| 97 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.
| |
| 98 switch (Linkage) { | |
| 99 default: | |
| 100 return false; | |
| 101 case llvm::GlobalValue::InternalLinkage: | |
| 102 return true; | |
| 103 case llvm::GlobalValue::ExternalLinkage: | |
| 104 return Ctx->getFlags().getAllowExternDefinedSymbols(); | |
| 105 } | |
| 106 } | |
| 107 | |
| 95 const GlobalDeclarationKind Kind; | 108 const GlobalDeclarationKind Kind; |
| 96 IceString Name; | 109 IceString Name; |
| 97 llvm::GlobalValue::LinkageTypes Linkage; | 110 llvm::GlobalValue::LinkageTypes Linkage; |
| 98 }; | 111 }; |
| 99 | 112 |
| 100 /// Models a function declaration. This includes the type signature of the | 113 /// Models a function declaration. This includes the type signature of the |
| 101 /// function, its calling conventions, and its linkage. | 114 /// function, its calling conventions, and its linkage. |
| 102 class FunctionDeclaration : public GlobalDeclaration { | 115 class FunctionDeclaration : public GlobalDeclaration { |
| 103 FunctionDeclaration() = delete; | 116 FunctionDeclaration() = delete; |
| 104 FunctionDeclaration(const FunctionDeclaration &) = delete; | 117 FunctionDeclaration(const FunctionDeclaration &) = delete; |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 117 llvm::CallingConv::ID getCallingConv() const { return CallingConv; } | 130 llvm::CallingConv::ID getCallingConv() const { return CallingConv; } |
| 118 /// isProto implies that there isn't a (local) definition for the function. | 131 /// isProto implies that there isn't a (local) definition for the function. |
| 119 bool isProto() const { return IsProto; } | 132 bool isProto() const { return IsProto; } |
| 120 static bool classof(const GlobalDeclaration *Addr) { | 133 static bool classof(const GlobalDeclaration *Addr) { |
| 121 return Addr->getKind() == FunctionDeclarationKind; | 134 return Addr->getKind() == FunctionDeclarationKind; |
| 122 } | 135 } |
| 123 void dumpType(Ostream &Stream) const final; | 136 void dumpType(Ostream &Stream) const final; |
| 124 void dump(GlobalContext *Ctx, Ostream &Stream) const final; | 137 void dump(GlobalContext *Ctx, Ostream &Stream) const final; |
| 125 bool getSuppressMangling() const final { return isExternal() && IsProto; } | 138 bool getSuppressMangling() const final { return isExternal() && IsProto; } |
| 126 | 139 |
| 140 /// Returns true if linkage is correct for the function declaration. | |
| 141 bool verifyLinkageCorrect(GlobalContext *Ctx) const { | |
| 142 if (isPNaClABIExternalName() || isIntrinsicName(Ctx)) | |
| 143 return Linkage == llvm::GlobalValue::ExternalLinkage; | |
| 144 return verifyLinkageDefault(Ctx); | |
| 145 } | |
| 146 | |
| 127 private: | 147 private: |
| 128 const Ice::FuncSigType Signature; | 148 const Ice::FuncSigType Signature; |
| 129 llvm::CallingConv::ID CallingConv; | 149 llvm::CallingConv::ID CallingConv; |
| 130 bool IsProto; | 150 bool IsProto; |
| 131 | 151 |
| 132 FunctionDeclaration(const FuncSigType &Signature, | 152 FunctionDeclaration(const FuncSigType &Signature, |
| 133 llvm::CallingConv::ID CallingConv, | 153 llvm::CallingConv::ID CallingConv, |
| 134 llvm::GlobalValue::LinkageTypes Linkage, bool IsProto) | 154 llvm::GlobalValue::LinkageTypes Linkage, bool IsProto) |
| 135 : GlobalDeclaration(FunctionDeclarationKind, Linkage), | 155 : GlobalDeclaration(FunctionDeclarationKind, Linkage), |
| 136 Signature(Signature), CallingConv(CallingConv), IsProto(IsProto) {} | 156 Signature(Signature), CallingConv(CallingConv), IsProto(IsProto) {} |
| 157 | |
| 158 bool isPNaClABIExternalName() const { | |
| 159 const char *Name = getName().c_str(); | |
| 160 return strcmp(Name, "_start") == 0 || strcmp(Name, "__pnacl_pso_root") == 0; | |
| 161 } | |
| 162 | |
| 163 bool isIntrinsicName(GlobalContext *Ctx) const { | |
| 164 if (!hasName()) return false; | |
|
Jim Stichnoth
2015/10/06 20:16:21
make format
Karl
2015/10/06 21:47:18
Done.
| |
| 165 bool BadIntrinsic; | |
| 166 return Ctx->getIntrinsicsInfo().find(getName(), BadIntrinsic) | |
| 167 && !BadIntrinsic; | |
| 168 } | |
| 137 }; | 169 }; |
| 138 | 170 |
| 139 /// Models a global variable declaration, and its initializers. | 171 /// Models a global variable declaration, and its initializers. |
| 140 class VariableDeclaration : public GlobalDeclaration { | 172 class VariableDeclaration : public GlobalDeclaration { |
| 141 VariableDeclaration(const VariableDeclaration &) = delete; | 173 VariableDeclaration(const VariableDeclaration &) = delete; |
| 142 VariableDeclaration &operator=(const VariableDeclaration &) = delete; | 174 VariableDeclaration &operator=(const VariableDeclaration &) = delete; |
| 143 | 175 |
| 144 public: | 176 public: |
| 145 /// Base class for a global variable initializer. | 177 /// Base class for a global variable initializer. |
| 146 class Initializer { | 178 class Initializer { |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 302 HasInitializer = true; | 334 HasInitializer = true; |
| 303 } | 335 } |
| 304 | 336 |
| 305 /// Prints out type for initializer associated with the declaration to Stream. | 337 /// Prints out type for initializer associated with the declaration to Stream. |
| 306 void dumpType(Ostream &Stream) const final; | 338 void dumpType(Ostream &Stream) const final; |
| 307 | 339 |
| 308 /// Prints out the definition of the global variable declaration (including | 340 /// Prints out the definition of the global variable declaration (including |
| 309 /// initialization). | 341 /// initialization). |
| 310 void dump(GlobalContext *Ctx, Ostream &Stream) const final; | 342 void dump(GlobalContext *Ctx, Ostream &Stream) const final; |
| 311 | 343 |
| 344 /// Returns true if linkage is correct for the variable declaration. | |
| 345 bool verifyLinkageCorrect(GlobalContext *Ctx) const { | |
| 346 return verifyLinkageDefault(Ctx); | |
| 347 } | |
| 348 | |
| 312 static bool classof(const GlobalDeclaration *Addr) { | 349 static bool classof(const GlobalDeclaration *Addr) { |
| 313 return Addr->getKind() == VariableDeclarationKind; | 350 return Addr->getKind() == VariableDeclarationKind; |
| 314 } | 351 } |
| 315 | 352 |
| 316 bool getSuppressMangling() const final { | 353 bool getSuppressMangling() const final { |
| 317 if (ForceSuppressMangling) | 354 if (ForceSuppressMangling) |
| 318 return true; | 355 return true; |
| 319 return isExternal() && !hasInitializer(); | 356 return isExternal() && !hasInitializer(); |
| 320 } | 357 } |
| 321 | 358 |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 351 template <class StreamType> | 388 template <class StreamType> |
| 352 inline StreamType &operator<<(StreamType &Stream, | 389 inline StreamType &operator<<(StreamType &Stream, |
| 353 const GlobalDeclaration &Addr) { | 390 const GlobalDeclaration &Addr) { |
| 354 Addr.dump(Stream); | 391 Addr.dump(Stream); |
| 355 return Stream; | 392 return Stream; |
| 356 } | 393 } |
| 357 | 394 |
| 358 } // end of namespace Ice | 395 } // end of namespace Ice |
| 359 | 396 |
| 360 #endif // SUBZERO_SRC_ICEGLOBALINITS_H | 397 #endif // SUBZERO_SRC_ICEGLOBALINITS_H |
| OLD | NEW |