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 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
80 | 80 |
81 /// Returns true if when emitting names, we should suppress mangling. | 81 /// Returns true if when emitting names, we should suppress mangling. |
82 virtual bool getSuppressMangling() const = 0; | 82 virtual bool getSuppressMangling() const = 0; |
83 | 83 |
84 /// Mangles name for cross tests, unless external and not defined locally (so | 84 /// Mangles name for cross tests, unless external and not defined locally (so |
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 /// Returns textual name of linkage. |
| 91 const char *getLinkageName() const { |
| 92 return isInternal() ? "internal" : "external"; |
| 93 } |
| 94 |
90 protected: | 95 protected: |
91 GlobalDeclaration(GlobalDeclarationKind Kind, | 96 GlobalDeclaration(GlobalDeclarationKind Kind, |
92 llvm::GlobalValue::LinkageTypes Linkage) | 97 llvm::GlobalValue::LinkageTypes Linkage) |
93 : Kind(Kind), Linkage(Linkage) {} | 98 : Kind(Kind), Linkage(Linkage) {} |
94 | 99 |
| 100 /// Returns true if linkage is defined correctly for the global declaration, |
| 101 /// based on default rules. |
| 102 bool verifyLinkageDefault(const GlobalContext *Ctx) const { |
| 103 switch (Linkage) { |
| 104 default: |
| 105 return false; |
| 106 case llvm::GlobalValue::InternalLinkage: |
| 107 return true; |
| 108 case llvm::GlobalValue::ExternalLinkage: |
| 109 return Ctx->getFlags().getAllowExternDefinedSymbols(); |
| 110 } |
| 111 } |
| 112 |
95 const GlobalDeclarationKind Kind; | 113 const GlobalDeclarationKind Kind; |
96 IceString Name; | 114 IceString Name; |
97 llvm::GlobalValue::LinkageTypes Linkage; | 115 llvm::GlobalValue::LinkageTypes Linkage; |
98 }; | 116 }; |
99 | 117 |
100 /// Models a function declaration. This includes the type signature of the | 118 /// Models a function declaration. This includes the type signature of the |
101 /// function, its calling conventions, and its linkage. | 119 /// function, its calling conventions, and its linkage. |
102 class FunctionDeclaration : public GlobalDeclaration { | 120 class FunctionDeclaration : public GlobalDeclaration { |
103 FunctionDeclaration() = delete; | 121 FunctionDeclaration() = delete; |
104 FunctionDeclaration(const FunctionDeclaration &) = delete; | 122 FunctionDeclaration(const FunctionDeclaration &) = delete; |
(...skipping 12 matching lines...) Expand all Loading... |
117 llvm::CallingConv::ID getCallingConv() const { return CallingConv; } | 135 llvm::CallingConv::ID getCallingConv() const { return CallingConv; } |
118 /// isProto implies that there isn't a (local) definition for the function. | 136 /// isProto implies that there isn't a (local) definition for the function. |
119 bool isProto() const { return IsProto; } | 137 bool isProto() const { return IsProto; } |
120 static bool classof(const GlobalDeclaration *Addr) { | 138 static bool classof(const GlobalDeclaration *Addr) { |
121 return Addr->getKind() == FunctionDeclarationKind; | 139 return Addr->getKind() == FunctionDeclarationKind; |
122 } | 140 } |
123 void dumpType(Ostream &Stream) const final; | 141 void dumpType(Ostream &Stream) const final; |
124 void dump(GlobalContext *Ctx, Ostream &Stream) const final; | 142 void dump(GlobalContext *Ctx, Ostream &Stream) const final; |
125 bool getSuppressMangling() const final { return isExternal() && IsProto; } | 143 bool getSuppressMangling() const final { return isExternal() && IsProto; } |
126 | 144 |
| 145 /// Returns true if linkage is correct for the function declaration. |
| 146 bool verifyLinkageCorrect(const GlobalContext *Ctx) const { |
| 147 if (isPNaClABIExternalName() || isIntrinsicName(Ctx)) |
| 148 return Linkage == llvm::GlobalValue::ExternalLinkage; |
| 149 return verifyLinkageDefault(Ctx); |
| 150 } |
| 151 |
127 private: | 152 private: |
128 const Ice::FuncSigType Signature; | 153 const Ice::FuncSigType Signature; |
129 llvm::CallingConv::ID CallingConv; | 154 llvm::CallingConv::ID CallingConv; |
130 bool IsProto; | 155 bool IsProto; |
131 | 156 |
132 FunctionDeclaration(const FuncSigType &Signature, | 157 FunctionDeclaration(const FuncSigType &Signature, |
133 llvm::CallingConv::ID CallingConv, | 158 llvm::CallingConv::ID CallingConv, |
134 llvm::GlobalValue::LinkageTypes Linkage, bool IsProto) | 159 llvm::GlobalValue::LinkageTypes Linkage, bool IsProto) |
135 : GlobalDeclaration(FunctionDeclarationKind, Linkage), | 160 : GlobalDeclaration(FunctionDeclarationKind, Linkage), |
136 Signature(Signature), CallingConv(CallingConv), IsProto(IsProto) {} | 161 Signature(Signature), CallingConv(CallingConv), IsProto(IsProto) {} |
| 162 |
| 163 bool isPNaClABIExternalName() const { |
| 164 const char *Name = getName().c_str(); |
| 165 return strcmp(Name, "_start") == 0 || strcmp(Name, "__pnacl_pso_root") == 0; |
| 166 } |
| 167 |
| 168 bool isIntrinsicName(const GlobalContext *Ctx) const { |
| 169 if (!hasName()) |
| 170 return false; |
| 171 bool BadIntrinsic; |
| 172 return Ctx->getIntrinsicsInfo().find(getName(), BadIntrinsic) && |
| 173 !BadIntrinsic; |
| 174 } |
137 }; | 175 }; |
138 | 176 |
139 /// Models a global variable declaration, and its initializers. | 177 /// Models a global variable declaration, and its initializers. |
140 class VariableDeclaration : public GlobalDeclaration { | 178 class VariableDeclaration : public GlobalDeclaration { |
141 VariableDeclaration(const VariableDeclaration &) = delete; | 179 VariableDeclaration(const VariableDeclaration &) = delete; |
142 VariableDeclaration &operator=(const VariableDeclaration &) = delete; | 180 VariableDeclaration &operator=(const VariableDeclaration &) = delete; |
143 | 181 |
144 public: | 182 public: |
145 /// Base class for a global variable initializer. | 183 /// Base class for a global variable initializer. |
146 class Initializer { | 184 class Initializer { |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
302 HasInitializer = true; | 340 HasInitializer = true; |
303 } | 341 } |
304 | 342 |
305 /// Prints out type for initializer associated with the declaration to Stream. | 343 /// Prints out type for initializer associated with the declaration to Stream. |
306 void dumpType(Ostream &Stream) const final; | 344 void dumpType(Ostream &Stream) const final; |
307 | 345 |
308 /// Prints out the definition of the global variable declaration (including | 346 /// Prints out the definition of the global variable declaration (including |
309 /// initialization). | 347 /// initialization). |
310 void dump(GlobalContext *Ctx, Ostream &Stream) const final; | 348 void dump(GlobalContext *Ctx, Ostream &Stream) const final; |
311 | 349 |
| 350 /// Returns true if linkage is correct for the variable declaration. |
| 351 bool verifyLinkageCorrect(const GlobalContext *Ctx) const { |
| 352 return verifyLinkageDefault(Ctx); |
| 353 } |
| 354 |
312 static bool classof(const GlobalDeclaration *Addr) { | 355 static bool classof(const GlobalDeclaration *Addr) { |
313 return Addr->getKind() == VariableDeclarationKind; | 356 return Addr->getKind() == VariableDeclarationKind; |
314 } | 357 } |
315 | 358 |
316 bool getSuppressMangling() const final { | 359 bool getSuppressMangling() const final { |
317 if (ForceSuppressMangling) | 360 if (ForceSuppressMangling) |
318 return true; | 361 return true; |
319 return isExternal() && !hasInitializer(); | 362 return isExternal() && !hasInitializer(); |
320 } | 363 } |
321 | 364 |
(...skipping 29 matching lines...) Expand all Loading... |
351 template <class StreamType> | 394 template <class StreamType> |
352 inline StreamType &operator<<(StreamType &Stream, | 395 inline StreamType &operator<<(StreamType &Stream, |
353 const GlobalDeclaration &Addr) { | 396 const GlobalDeclaration &Addr) { |
354 Addr.dump(Stream); | 397 Addr.dump(Stream); |
355 return Stream; | 398 return Stream; |
356 } | 399 } |
357 | 400 |
358 } // end of namespace Ice | 401 } // end of namespace Ice |
359 | 402 |
360 #endif // SUBZERO_SRC_ICEGLOBALINITS_H | 403 #endif // SUBZERO_SRC_ICEGLOBALINITS_H |
OLD | NEW |