Bug Summary

File:lib/IR/Verifier.cpp
Location:line 2061, column 7
Description:Called C++ object pointer is null

Annotated Source Code

1//===-- Verifier.cpp - Implement the Module Verifier -----------------------==//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the function verifier interface, that can be used for some
11// sanity checking of input to the system.
12//
13// Note that this does not provide full `Java style' security and verifications,
14// instead it just tries to ensure that code is well-formed.
15//
16// * Both of a binary operator's parameters are of the same type
17// * Verify that the indices of mem access instructions match other operands
18// * Verify that arithmetic and other things are only performed on first-class
19// types. Verify that shifts & logicals only happen on integrals f.e.
20// * All of the constants in a switch statement are of the correct type
21// * The code is in valid SSA form
22// * It should be illegal to put a label into any other type (like a structure)
23// or to return one. [except constant arrays!]
24// * Only phi nodes can be self referential: 'add i32 %0, %0 ; <int>:0' is bad
25// * PHI nodes must have an entry for each predecessor, with no extras.
26// * PHI nodes must be the first thing in a basic block, all grouped together
27// * PHI nodes must have at least one entry
28// * All basic blocks should only end with terminator insts, not contain them
29// * The entry node to a function must not have predecessors
30// * All Instructions must be embedded into a basic block
31// * Functions cannot take a void-typed parameter
32// * Verify that a function's argument list agrees with it's declared type.
33// * It is illegal to specify a name for a void value.
34// * It is illegal to have a internal global value with no initializer
35// * It is illegal to have a ret instruction that returns a value that does not
36// agree with the function return value type.
37// * Function call argument types match the function prototype
38// * A landing pad is defined by a landingpad instruction, and can be jumped to
39// only by the unwind edge of an invoke instruction.
40// * A landingpad instruction must be the first non-PHI instruction in the
41// block.
42// * Landingpad instructions must be in a function with a personality function.
43// * All other things that are tested by asserts spread about the code...
44//
45//===----------------------------------------------------------------------===//
46
47#include "llvm/IR/Verifier.h"
48#include "llvm/ADT/MapVector.h"
49#include "llvm/ADT/STLExtras.h"
50#include "llvm/ADT/SetVector.h"
51#include "llvm/ADT/SmallPtrSet.h"
52#include "llvm/ADT/SmallVector.h"
53#include "llvm/ADT/StringExtras.h"
54#include "llvm/IR/CFG.h"
55#include "llvm/IR/CallSite.h"
56#include "llvm/IR/CallingConv.h"
57#include "llvm/IR/ConstantRange.h"
58#include "llvm/IR/Constants.h"
59#include "llvm/IR/DataLayout.h"
60#include "llvm/IR/DebugInfo.h"
61#include "llvm/IR/DerivedTypes.h"
62#include "llvm/IR/DiagnosticInfo.h"
63#include "llvm/IR/Dominators.h"
64#include "llvm/IR/InlineAsm.h"
65#include "llvm/IR/InstIterator.h"
66#include "llvm/IR/InstVisitor.h"
67#include "llvm/IR/IntrinsicInst.h"
68#include "llvm/IR/LLVMContext.h"
69#include "llvm/IR/Metadata.h"
70#include "llvm/IR/Module.h"
71#include "llvm/IR/ModuleSlotTracker.h"
72#include "llvm/IR/PassManager.h"
73#include "llvm/IR/Statepoint.h"
74#include "llvm/Pass.h"
75#include "llvm/Support/CommandLine.h"
76#include "llvm/Support/Debug.h"
77#include "llvm/Support/ErrorHandling.h"
78#include "llvm/Support/raw_ostream.h"
79#include <algorithm>
80#include <cstdarg>
81using namespace llvm;
82
83static cl::opt<bool> VerifyDebugInfo("verify-debug-info", cl::init(true));
84
85namespace {
86struct VerifierSupport {
87 raw_ostream *OS;
88 const Module *M = nullptr;
89 Optional<ModuleSlotTracker> MST;
90
91 /// Track the brokenness of the module while recursively visiting.
92 bool Broken = false;
93 /// Broken debug info can be "recovered" from by stripping the debug info.
94 bool BrokenDebugInfo = false;
95 /// Whether to treat broken debug info as an error.
96 bool TreatBrokenDebugInfoAsError = true;
97
98 explicit VerifierSupport(raw_ostream *OS) : OS(OS) {}
99
100private:
101 template <class NodeTy> void Write(const ilist_iterator<NodeTy> &I) {
102 Write(&*I);
103 }
104
105 void Write(const Module *M) {
106 if (!M)
107 return;
108 *OS << "; ModuleID = '" << M->getModuleIdentifier() << "'\n";
109 }
110
111 void Write(const Value *V) {
112 if (!V)
113 return;
114 if (isa<Instruction>(V)) {
115 V->print(*OS, *MST);
116 *OS << '\n';
117 } else {
118 V->printAsOperand(*OS, true, *MST);
119 *OS << '\n';
120 }
121 }
122 void Write(ImmutableCallSite CS) {
123 Write(CS.getInstruction());
124 }
125
126 void Write(const Metadata *MD) {
127 if (!MD)
128 return;
129 MD->print(*OS, *MST, M);
130 *OS << '\n';
131 }
132
133 template <class T> void Write(const MDTupleTypedArrayWrapper<T> &MD) {
134 Write(MD.get());
135 }
136
137 void Write(const NamedMDNode *NMD) {
138 if (!NMD)
139 return;
140 NMD->print(*OS, *MST);
141 *OS << '\n';
142 }
143
144 void Write(Type *T) {
145 if (!T)
146 return;
147 *OS << ' ' << *T;
148 }
149
150 void Write(const Comdat *C) {
151 if (!C)
152 return;
153 *OS << *C;
154 }
155
156 template <typename T> void Write(ArrayRef<T> Vs) {
157 for (const T &V : Vs)
158 Write(V);
159 }
160
161 template <typename T1, typename... Ts>
162 void WriteTs(const T1 &V1, const Ts &... Vs) {
163 Write(V1);
164 WriteTs(Vs...);
165 }
166
167 template <typename... Ts> void WriteTs() {}
168
169public:
170 /// \brief A check failed, so printout out the condition and the message.
171 ///
172 /// This provides a nice place to put a breakpoint if you want to see why
173 /// something is not correct.
174 void CheckFailed(const Twine &Message) {
175 if (OS)
176 *OS << Message << '\n';
177 Broken = true;
178 }
179
180 /// \brief A check failed (with values to print).
181 ///
182 /// This calls the Message-only version so that the above is easier to set a
183 /// breakpoint on.
184 template <typename T1, typename... Ts>
185 void CheckFailed(const Twine &Message, const T1 &V1, const Ts &... Vs) {
186 CheckFailed(Message);
187 if (OS)
188 WriteTs(V1, Vs...);
189 }
190
191 /// A debug info check failed.
192 void DebugInfoCheckFailed(const Twine &Message) {
193 if (OS)
194 *OS << Message << '\n';
195 Broken |= TreatBrokenDebugInfoAsError;
196 BrokenDebugInfo = true;
197 }
198
199 /// A debug info check failed (with values to print).
200 template <typename T1, typename... Ts>
201 void DebugInfoCheckFailed(const Twine &Message, const T1 &V1,
202 const Ts &... Vs) {
203 DebugInfoCheckFailed(Message);
204 if (OS)
205 WriteTs(V1, Vs...);
206 }
207};
208
209class Verifier : public InstVisitor<Verifier>, VerifierSupport {
210 friend class InstVisitor<Verifier>;
211
212 LLVMContext *Context;
213 DominatorTree DT;
214
215 /// \brief When verifying a basic block, keep track of all of the
216 /// instructions we have seen so far.
217 ///
218 /// This allows us to do efficient dominance checks for the case when an
219 /// instruction has an operand that is an instruction in the same block.
220 SmallPtrSet<Instruction *, 16> InstsInThisBlock;
221
222 /// \brief Keep track of the metadata nodes that have been checked already.
223 SmallPtrSet<const Metadata *, 32> MDNodes;
224
225 /// Track all DICompileUnits visited.
226 SmallPtrSet<const Metadata *, 2> CUVisited;
227
228 /// \brief The result type for a landingpad.
229 Type *LandingPadResultTy;
230
231 /// \brief Whether we've seen a call to @llvm.localescape in this function
232 /// already.
233 bool SawFrameEscape;
234
235 /// Stores the count of how many objects were passed to llvm.localescape for a
236 /// given function and the largest index passed to llvm.localrecover.
237 DenseMap<Function *, std::pair<unsigned, unsigned>> FrameEscapeInfo;
238
239 // Maps catchswitches and cleanuppads that unwind to siblings to the
240 // terminators that indicate the unwind, used to detect cycles therein.
241 MapVector<Instruction *, TerminatorInst *> SiblingFuncletInfo;
242
243 /// Cache of constants visited in search of ConstantExprs.
244 SmallPtrSet<const Constant *, 32> ConstantExprVisited;
245
246 /// Cache of declarations of the llvm.experimental.deoptimize.<ty> intrinsic.
247 SmallVector<const Function *, 4> DeoptimizeDeclarations;
248
249 // Verify that this GlobalValue is only used in this module.
250 // This map is used to avoid visiting uses twice. We can arrive at a user
251 // twice, if they have multiple operands. In particular for very large
252 // constant expressions, we can arrive at a particular user many times.
253 SmallPtrSet<const Value *, 32> GlobalValueVisited;
254
255 void checkAtomicMemAccessSize(const Module *M, Type *Ty,
256 const Instruction *I);
257
258 void updateModule(const Module *NewM) {
259 if (M == NewM)
260 return;
261 MST.emplace(NewM);
262 M = NewM;
263 }
264
265public:
266 explicit Verifier(raw_ostream *OS, bool ShouldTreatBrokenDebugInfoAsError)
267 : VerifierSupport(OS), Context(nullptr), LandingPadResultTy(nullptr),
268 SawFrameEscape(false) {
269 TreatBrokenDebugInfoAsError = ShouldTreatBrokenDebugInfoAsError;
270 }
271
272 bool hasBrokenDebugInfo() const { return BrokenDebugInfo; }
273
274 bool verify(const Function &F) {
275 updateModule(F.getParent());
276 Context = &M->getContext();
277
278 // First ensure the function is well-enough formed to compute dominance
279 // information.
280 if (F.empty()) {
281 if (OS)
282 *OS << "Function '" << F.getName()
283 << "' does not contain an entry block!\n";
284 return false;
285 }
286 for (const BasicBlock &BB : F) {
287 if (!BB.empty() && BB.back().isTerminator())
288 continue;
289
290 if (OS) {
291 *OS << "Basic Block in function '" << F.getName()
292 << "' does not have terminator!\n";
293 BB.printAsOperand(*OS, true, *MST);
294 *OS << "\n";
295 }
296 return false;
297 }
298
299 // Now directly compute a dominance tree. We don't rely on the pass
300 // manager to provide this as it isolates us from a potentially
301 // out-of-date dominator tree and makes it significantly more complex to
302 // run this code outside of a pass manager.
303 // FIXME: It's really gross that we have to cast away constness here.
304 DT.recalculate(const_cast<Function &>(F));
305
306 Broken = false;
307 // FIXME: We strip const here because the inst visitor strips const.
308 visit(const_cast<Function &>(F));
309 verifySiblingFuncletUnwinds();
310 InstsInThisBlock.clear();
311 LandingPadResultTy = nullptr;
312 SawFrameEscape = false;
313 SiblingFuncletInfo.clear();
314
315 return !Broken;
316 }
317
318 bool verify(const Module &M) {
319 updateModule(&M);
320 Context = &M.getContext();
321 Broken = false;
322
323 // Scan through, checking all of the external function's linkage now...
324 for (const Function &F : M) {
325 visitGlobalValue(F);
326
327 // Check to make sure function prototypes are okay.
328 if (F.isDeclaration()) {
329 visitFunction(F);
330 if (F.getIntrinsicID() == Intrinsic::experimental_deoptimize)
331 DeoptimizeDeclarations.push_back(&F);
332 }
333 }
334
335 // Now that we've visited every function, verify that we never asked to
336 // recover a frame index that wasn't escaped.
337 verifyFrameRecoverIndices();
338 for (const GlobalVariable &GV : M.globals())
339 visitGlobalVariable(GV);
340
341 for (const GlobalAlias &GA : M.aliases())
342 visitGlobalAlias(GA);
343
344 for (const NamedMDNode &NMD : M.named_metadata())
345 visitNamedMDNode(NMD);
346
347 for (const StringMapEntry<Comdat> &SMEC : M.getComdatSymbolTable())
348 visitComdat(SMEC.getValue());
349
350 visitModuleFlags(M);
351 visitModuleIdents(M);
352
353 verifyCompileUnits();
354
355 verifyDeoptimizeCallingConvs();
356
357 return !Broken;
358 }
359
360private:
361 // Verification methods...
362 void visitGlobalValue(const GlobalValue &GV);
363 void visitGlobalVariable(const GlobalVariable &GV);
364 void visitGlobalAlias(const GlobalAlias &GA);
365 void visitAliaseeSubExpr(const GlobalAlias &A, const Constant &C);
366 void visitAliaseeSubExpr(SmallPtrSetImpl<const GlobalAlias *> &Visited,
367 const GlobalAlias &A, const Constant &C);
368 void visitNamedMDNode(const NamedMDNode &NMD);
369 void visitMDNode(const MDNode &MD);
370 void visitMetadataAsValue(const MetadataAsValue &MD, Function *F);
371 void visitValueAsMetadata(const ValueAsMetadata &MD, Function *F);
372 void visitComdat(const Comdat &C);
373 void visitModuleIdents(const Module &M);
374 void visitModuleFlags(const Module &M);
375 void visitModuleFlag(const MDNode *Op,
376 DenseMap<const MDString *, const MDNode *> &SeenIDs,
377 SmallVectorImpl<const MDNode *> &Requirements);
378 void visitFunction(const Function &F);
379 void visitBasicBlock(BasicBlock &BB);
380 void visitRangeMetadata(Instruction& I, MDNode* Range, Type* Ty);
381 void visitDereferenceableMetadata(Instruction& I, MDNode* MD);
382
383 template <class Ty> bool isValidMetadataArray(const MDTuple &N);
384#define HANDLE_SPECIALIZED_MDNODE_LEAF(CLASS) void visit##CLASS(const CLASS &N);
385#include "llvm/IR/Metadata.def"
386 void visitDIScope(const DIScope &N);
387 void visitDIVariable(const DIVariable &N);
388 void visitDILexicalBlockBase(const DILexicalBlockBase &N);
389 void visitDITemplateParameter(const DITemplateParameter &N);
390
391 void visitTemplateParams(const MDNode &N, const Metadata &RawParams);
392
393 // InstVisitor overrides...
394 using InstVisitor<Verifier>::visit;
395 void visit(Instruction &I);
396
397 void visitTruncInst(TruncInst &I);
398 void visitZExtInst(ZExtInst &I);
399 void visitSExtInst(SExtInst &I);
400 void visitFPTruncInst(FPTruncInst &I);
401 void visitFPExtInst(FPExtInst &I);
402 void visitFPToUIInst(FPToUIInst &I);
403 void visitFPToSIInst(FPToSIInst &I);
404 void visitUIToFPInst(UIToFPInst &I);
405 void visitSIToFPInst(SIToFPInst &I);
406 void visitIntToPtrInst(IntToPtrInst &I);
407 void visitPtrToIntInst(PtrToIntInst &I);
408 void visitBitCastInst(BitCastInst &I);
409 void visitAddrSpaceCastInst(AddrSpaceCastInst &I);
410 void visitPHINode(PHINode &PN);
411 void visitBinaryOperator(BinaryOperator &B);
412 void visitICmpInst(ICmpInst &IC);
413 void visitFCmpInst(FCmpInst &FC);
414 void visitExtractElementInst(ExtractElementInst &EI);
415 void visitInsertElementInst(InsertElementInst &EI);
416 void visitShuffleVectorInst(ShuffleVectorInst &EI);
417 void visitVAArgInst(VAArgInst &VAA) { visitInstruction(VAA); }
418 void visitCallInst(CallInst &CI);
419 void visitInvokeInst(InvokeInst &II);
420 void visitGetElementPtrInst(GetElementPtrInst &GEP);
421 void visitLoadInst(LoadInst &LI);
422 void visitStoreInst(StoreInst &SI);
423 void verifyDominatesUse(Instruction &I, unsigned i);
424 void visitInstruction(Instruction &I);
425 void visitTerminatorInst(TerminatorInst &I);
426 void visitBranchInst(BranchInst &BI);
427 void visitReturnInst(ReturnInst &RI);
428 void visitSwitchInst(SwitchInst &SI);
429 void visitIndirectBrInst(IndirectBrInst &BI);
430 void visitSelectInst(SelectInst &SI);
431 void visitUserOp1(Instruction &I);
432 void visitUserOp2(Instruction &I) { visitUserOp1(I); }
433 void visitIntrinsicCallSite(Intrinsic::ID ID, CallSite CS);
434 template <class DbgIntrinsicTy>
435 void visitDbgIntrinsic(StringRef Kind, DbgIntrinsicTy &DII);
436 void visitAtomicCmpXchgInst(AtomicCmpXchgInst &CXI);
437 void visitAtomicRMWInst(AtomicRMWInst &RMWI);
438 void visitFenceInst(FenceInst &FI);
439 void visitAllocaInst(AllocaInst &AI);
440 void visitExtractValueInst(ExtractValueInst &EVI);
441 void visitInsertValueInst(InsertValueInst &IVI);
442 void visitEHPadPredecessors(Instruction &I);
443 void visitLandingPadInst(LandingPadInst &LPI);
444 void visitCatchPadInst(CatchPadInst &CPI);
445 void visitCatchReturnInst(CatchReturnInst &CatchReturn);
446 void visitCleanupPadInst(CleanupPadInst &CPI);
447 void visitFuncletPadInst(FuncletPadInst &FPI);
448 void visitCatchSwitchInst(CatchSwitchInst &CatchSwitch);
449 void visitCleanupReturnInst(CleanupReturnInst &CRI);
450
451 void verifyCallSite(CallSite CS);
452 void verifySwiftErrorCallSite(CallSite CS, const Value *SwiftErrorVal);
453 void verifySwiftErrorValue(const Value *SwiftErrorVal);
454 void verifyMustTailCall(CallInst &CI);
455 bool performTypeCheck(Intrinsic::ID ID, Function *F, Type *Ty, int VT,
456 unsigned ArgNo, std::string &Suffix);
457 bool verifyIntrinsicType(Type *Ty, ArrayRef<Intrinsic::IITDescriptor> &Infos,
458 SmallVectorImpl<Type *> &ArgTys);
459 bool verifyIntrinsicIsVarArg(bool isVarArg,
460 ArrayRef<Intrinsic::IITDescriptor> &Infos);
461 bool verifyAttributeCount(AttributeSet Attrs, unsigned Params);
462 void verifyAttributeTypes(AttributeSet Attrs, unsigned Idx, bool isFunction,
463 const Value *V);
464 void verifyParameterAttrs(AttributeSet Attrs, unsigned Idx, Type *Ty,
465 bool isReturnValue, const Value *V);
466 void verifyFunctionAttrs(FunctionType *FT, AttributeSet Attrs,
467 const Value *V);
468 void verifyFunctionMetadata(
469 const SmallVector<std::pair<unsigned, MDNode *>, 4> MDs);
470
471 void visitConstantExprsRecursively(const Constant *EntryC);
472 void visitConstantExpr(const ConstantExpr *CE);
473 void verifyStatepoint(ImmutableCallSite CS);
474 void verifyFrameRecoverIndices();
475 void verifySiblingFuncletUnwinds();
476
477 void verifyBitPieceExpression(const DbgInfoIntrinsic &I);
478
479 /// Module-level debug info verification...
480 void verifyCompileUnits();
481
482 /// Module-level verification that all @llvm.experimental.deoptimize
483 /// declarations share the same calling convention.
484 void verifyDeoptimizeCallingConvs();
485};
486} // End anonymous namespace
487
488/// We know that cond should be true, if not print an error message.
489#define Assert(C, ...)do { if (!(C)) { CheckFailed(...); return; } } while (0) \
490 do { if (!(C)) { CheckFailed(__VA_ARGS__); return; } } while (0)
491
492/// We know that a debug info condition should be true, if not print
493/// an error message.
494#define AssertDI(C, ...)do { if (!(C)) { DebugInfoCheckFailed(...); return; } } while
(0)
\
495 do { if (!(C)) { DebugInfoCheckFailed(__VA_ARGS__); return; } } while (0)
496
497
498void Verifier::visit(Instruction &I) {
499 for (unsigned i = 0, e = I.getNumOperands(); i != e; ++i)
500 Assert(I.getOperand(i) != nullptr, "Operand is null", &I)do { if (!(I.getOperand(i) != nullptr)) { CheckFailed("Operand is null"
, &I); return; } } while (0)
;
501 InstVisitor<Verifier>::visit(I);
502}
503
504// Helper to recursively iterate over indirect users. By
505// returning false, the callback can ask to stop recursing
506// further.
507static void forEachUser(const Value *User,
508 SmallPtrSet<const Value *, 32> &Visited,
509 llvm::function_ref<bool(const Value *)> Callback) {
510 if (!Visited.insert(User).second)
511 return;
512 for (const Value *TheNextUser : User->materialized_users())
513 if (Callback(TheNextUser))
514 forEachUser(TheNextUser, Visited, Callback);
515}
516
517void Verifier::visitGlobalValue(const GlobalValue &GV) {
518 Assert(!GV.isDeclaration() || GV.hasValidDeclarationLinkage(),do { if (!(!GV.isDeclaration() || GV.hasValidDeclarationLinkage
())) { CheckFailed("Global is external, but doesn't have external or weak linkage!"
, &GV); return; } } while (0)
519 "Global is external, but doesn't have external or weak linkage!", &GV)do { if (!(!GV.isDeclaration() || GV.hasValidDeclarationLinkage
())) { CheckFailed("Global is external, but doesn't have external or weak linkage!"
, &GV); return; } } while (0)
;
520
521 Assert(GV.getAlignment() <= Value::MaximumAlignment,do { if (!(GV.getAlignment() <= Value::MaximumAlignment)) {
CheckFailed("huge alignment values are unsupported", &GV
); return; } } while (0)
522 "huge alignment values are unsupported", &GV)do { if (!(GV.getAlignment() <= Value::MaximumAlignment)) {
CheckFailed("huge alignment values are unsupported", &GV
); return; } } while (0)
;
523 Assert(!GV.hasAppendingLinkage() || isa<GlobalVariable>(GV),do { if (!(!GV.hasAppendingLinkage() || isa<GlobalVariable
>(GV))) { CheckFailed("Only global variables can have appending linkage!"
, &GV); return; } } while (0)
524 "Only global variables can have appending linkage!", &GV)do { if (!(!GV.hasAppendingLinkage() || isa<GlobalVariable
>(GV))) { CheckFailed("Only global variables can have appending linkage!"
, &GV); return; } } while (0)
;
525
526 if (GV.hasAppendingLinkage()) {
527 const GlobalVariable *GVar = dyn_cast<GlobalVariable>(&GV);
528 Assert(GVar && GVar->getValueType()->isArrayTy(),do { if (!(GVar && GVar->getValueType()->isArrayTy
())) { CheckFailed("Only global arrays can have appending linkage!"
, GVar); return; } } while (0)
529 "Only global arrays can have appending linkage!", GVar)do { if (!(GVar && GVar->getValueType()->isArrayTy
())) { CheckFailed("Only global arrays can have appending linkage!"
, GVar); return; } } while (0)
;
530 }
531
532 if (GV.isDeclarationForLinker())
533 Assert(!GV.hasComdat(), "Declaration may not be in a Comdat!", &GV)do { if (!(!GV.hasComdat())) { CheckFailed("Declaration may not be in a Comdat!"
, &GV); return; } } while (0)
;
534
535 forEachUser(&GV, GlobalValueVisited, [&](const Value *V) -> bool {
536 if (const Instruction *I = dyn_cast<Instruction>(V)) {
537 if (!I->getParent() || !I->getParent()->getParent())
538 CheckFailed("Global is referenced by parentless instruction!", &GV,
539 M, I);
540 else if (I->getParent()->getParent()->getParent() != M)
541 CheckFailed("Global is referenced in a different module!", &GV,
542 M, I, I->getParent()->getParent(),
543 I->getParent()->getParent()->getParent());
544 return false;
545 } else if (const Function *F = dyn_cast<Function>(V)) {
546 if (F->getParent() != M)
547 CheckFailed("Global is used by function in a different module", &GV,
548 M, F, F->getParent());
549 return false;
550 }
551 return true;
552 });
553}
554
555void Verifier::visitGlobalVariable(const GlobalVariable &GV) {
556 if (GV.hasInitializer()) {
557 Assert(GV.getInitializer()->getType() == GV.getValueType(),do { if (!(GV.getInitializer()->getType() == GV.getValueType
())) { CheckFailed("Global variable initializer type does not match global "
"variable type!", &GV); return; } } while (0)
558 "Global variable initializer type does not match global "do { if (!(GV.getInitializer()->getType() == GV.getValueType
())) { CheckFailed("Global variable initializer type does not match global "
"variable type!", &GV); return; } } while (0)
559 "variable type!",do { if (!(GV.getInitializer()->getType() == GV.getValueType
())) { CheckFailed("Global variable initializer type does not match global "
"variable type!", &GV); return; } } while (0)
560 &GV)do { if (!(GV.getInitializer()->getType() == GV.getValueType
())) { CheckFailed("Global variable initializer type does not match global "
"variable type!", &GV); return; } } while (0)
;
561
562 // If the global has common linkage, it must have a zero initializer and
563 // cannot be constant.
564 if (GV.hasCommonLinkage()) {
565 Assert(GV.getInitializer()->isNullValue(),do { if (!(GV.getInitializer()->isNullValue())) { CheckFailed
("'common' global must have a zero initializer!", &GV); return
; } } while (0)
566 "'common' global must have a zero initializer!", &GV)do { if (!(GV.getInitializer()->isNullValue())) { CheckFailed
("'common' global must have a zero initializer!", &GV); return
; } } while (0)
;
567 Assert(!GV.isConstant(), "'common' global may not be marked constant!",do { if (!(!GV.isConstant())) { CheckFailed("'common' global may not be marked constant!"
, &GV); return; } } while (0)
568 &GV)do { if (!(!GV.isConstant())) { CheckFailed("'common' global may not be marked constant!"
, &GV); return; } } while (0)
;
569 Assert(!GV.hasComdat(), "'common' global may not be in a Comdat!", &GV)do { if (!(!GV.hasComdat())) { CheckFailed("'common' global may not be in a Comdat!"
, &GV); return; } } while (0)
;
570 }
571 }
572
573 if (GV.hasName() && (GV.getName() == "llvm.global_ctors" ||
574 GV.getName() == "llvm.global_dtors")) {
575 Assert(!GV.hasInitializer() || GV.hasAppendingLinkage(),do { if (!(!GV.hasInitializer() || GV.hasAppendingLinkage()))
{ CheckFailed("invalid linkage for intrinsic global variable"
, &GV); return; } } while (0)
576 "invalid linkage for intrinsic global variable", &GV)do { if (!(!GV.hasInitializer() || GV.hasAppendingLinkage()))
{ CheckFailed("invalid linkage for intrinsic global variable"
, &GV); return; } } while (0)
;
577 // Don't worry about emitting an error for it not being an array,
578 // visitGlobalValue will complain on appending non-array.
579 if (ArrayType *ATy = dyn_cast<ArrayType>(GV.getValueType())) {
580 StructType *STy = dyn_cast<StructType>(ATy->getElementType());
581 PointerType *FuncPtrTy =
582 FunctionType::get(Type::getVoidTy(*Context), false)->getPointerTo();
583 // FIXME: Reject the 2-field form in LLVM 4.0.
584 Assert(STy &&do { if (!(STy && (STy->getNumElements() == 2 || STy
->getNumElements() == 3) && STy->getTypeAtIndex
(0u)->isIntegerTy(32) && STy->getTypeAtIndex(1)
== FuncPtrTy)) { CheckFailed("wrong type for intrinsic global variable"
, &GV); return; } } while (0)
585 (STy->getNumElements() == 2 || STy->getNumElements() == 3) &&do { if (!(STy && (STy->getNumElements() == 2 || STy
->getNumElements() == 3) && STy->getTypeAtIndex
(0u)->isIntegerTy(32) && STy->getTypeAtIndex(1)
== FuncPtrTy)) { CheckFailed("wrong type for intrinsic global variable"
, &GV); return; } } while (0)
586 STy->getTypeAtIndex(0u)->isIntegerTy(32) &&do { if (!(STy && (STy->getNumElements() == 2 || STy
->getNumElements() == 3) && STy->getTypeAtIndex
(0u)->isIntegerTy(32) && STy->getTypeAtIndex(1)
== FuncPtrTy)) { CheckFailed("wrong type for intrinsic global variable"
, &GV); return; } } while (0)
587 STy->getTypeAtIndex(1) == FuncPtrTy,do { if (!(STy && (STy->getNumElements() == 2 || STy
->getNumElements() == 3) && STy->getTypeAtIndex
(0u)->isIntegerTy(32) && STy->getTypeAtIndex(1)
== FuncPtrTy)) { CheckFailed("wrong type for intrinsic global variable"
, &GV); return; } } while (0)
588 "wrong type for intrinsic global variable", &GV)do { if (!(STy && (STy->getNumElements() == 2 || STy
->getNumElements() == 3) && STy->getTypeAtIndex
(0u)->isIntegerTy(32) && STy->getTypeAtIndex(1)
== FuncPtrTy)) { CheckFailed("wrong type for intrinsic global variable"
, &GV); return; } } while (0)
;
589 if (STy->getNumElements() == 3) {
590 Type *ETy = STy->getTypeAtIndex(2);
591 Assert(ETy->isPointerTy() &&do { if (!(ETy->isPointerTy() && cast<PointerType
>(ETy)->getElementType()->isIntegerTy(8))) { CheckFailed
("wrong type for intrinsic global variable", &GV); return
; } } while (0)
592 cast<PointerType>(ETy)->getElementType()->isIntegerTy(8),do { if (!(ETy->isPointerTy() && cast<PointerType
>(ETy)->getElementType()->isIntegerTy(8))) { CheckFailed
("wrong type for intrinsic global variable", &GV); return
; } } while (0)
593 "wrong type for intrinsic global variable", &GV)do { if (!(ETy->isPointerTy() && cast<PointerType
>(ETy)->getElementType()->isIntegerTy(8))) { CheckFailed
("wrong type for intrinsic global variable", &GV); return
; } } while (0)
;
594 }
595 }
596 }
597
598 if (GV.hasName() && (GV.getName() == "llvm.used" ||
599 GV.getName() == "llvm.compiler.used")) {
600 Assert(!GV.hasInitializer() || GV.hasAppendingLinkage(),do { if (!(!GV.hasInitializer() || GV.hasAppendingLinkage()))
{ CheckFailed("invalid linkage for intrinsic global variable"
, &GV); return; } } while (0)
601 "invalid linkage for intrinsic global variable", &GV)do { if (!(!GV.hasInitializer() || GV.hasAppendingLinkage()))
{ CheckFailed("invalid linkage for intrinsic global variable"
, &GV); return; } } while (0)
;
602 Type *GVType = GV.getValueType();
603 if (ArrayType *ATy = dyn_cast<ArrayType>(GVType)) {
604 PointerType *PTy = dyn_cast<PointerType>(ATy->getElementType());
605 Assert(PTy, "wrong type for intrinsic global variable", &GV)do { if (!(PTy)) { CheckFailed("wrong type for intrinsic global variable"
, &GV); return; } } while (0)
;
606 if (GV.hasInitializer()) {
607 const Constant *Init = GV.getInitializer();
608 const ConstantArray *InitArray = dyn_cast<ConstantArray>(Init);
609 Assert(InitArray, "wrong initalizer for intrinsic global variable",do { if (!(InitArray)) { CheckFailed("wrong initalizer for intrinsic global variable"
, Init); return; } } while (0)
610 Init)do { if (!(InitArray)) { CheckFailed("wrong initalizer for intrinsic global variable"
, Init); return; } } while (0)
;
611 for (Value *Op : InitArray->operands()) {
612 Value *V = Op->stripPointerCastsNoFollowAliases();
613 Assert(isa<GlobalVariable>(V) || isa<Function>(V) ||do { if (!(isa<GlobalVariable>(V) || isa<Function>
(V) || isa<GlobalAlias>(V))) { CheckFailed("invalid llvm.used member"
, V); return; } } while (0)
614 isa<GlobalAlias>(V),do { if (!(isa<GlobalVariable>(V) || isa<Function>
(V) || isa<GlobalAlias>(V))) { CheckFailed("invalid llvm.used member"
, V); return; } } while (0)
615 "invalid llvm.used member", V)do { if (!(isa<GlobalVariable>(V) || isa<Function>
(V) || isa<GlobalAlias>(V))) { CheckFailed("invalid llvm.used member"
, V); return; } } while (0)
;
616 Assert(V->hasName(), "members of llvm.used must be named", V)do { if (!(V->hasName())) { CheckFailed("members of llvm.used must be named"
, V); return; } } while (0)
;
617 }
618 }
619 }
620 }
621
622 Assert(!GV.hasDLLImportStorageClass() ||do { if (!(!GV.hasDLLImportStorageClass() || (GV.isDeclaration
() && GV.hasExternalLinkage()) || GV.hasAvailableExternallyLinkage
())) { CheckFailed("Global is marked as dllimport, but not external"
, &GV); return; } } while (0)
623 (GV.isDeclaration() && GV.hasExternalLinkage()) ||do { if (!(!GV.hasDLLImportStorageClass() || (GV.isDeclaration
() && GV.hasExternalLinkage()) || GV.hasAvailableExternallyLinkage
())) { CheckFailed("Global is marked as dllimport, but not external"
, &GV); return; } } while (0)
624 GV.hasAvailableExternallyLinkage(),do { if (!(!GV.hasDLLImportStorageClass() || (GV.isDeclaration
() && GV.hasExternalLinkage()) || GV.hasAvailableExternallyLinkage
())) { CheckFailed("Global is marked as dllimport, but not external"
, &GV); return; } } while (0)
625 "Global is marked as dllimport, but not external", &GV)do { if (!(!GV.hasDLLImportStorageClass() || (GV.isDeclaration
() && GV.hasExternalLinkage()) || GV.hasAvailableExternallyLinkage
())) { CheckFailed("Global is marked as dllimport, but not external"
, &GV); return; } } while (0)
;
626
627 if (!GV.hasInitializer()) {
628 visitGlobalValue(GV);
629 return;
630 }
631
632 // Walk any aggregate initializers looking for bitcasts between address spaces
633 visitConstantExprsRecursively(GV.getInitializer());
634
635 visitGlobalValue(GV);
636}
637
638void Verifier::visitAliaseeSubExpr(const GlobalAlias &GA, const Constant &C) {
639 SmallPtrSet<const GlobalAlias*, 4> Visited;
640 Visited.insert(&GA);
641 visitAliaseeSubExpr(Visited, GA, C);
642}
643
644void Verifier::visitAliaseeSubExpr(SmallPtrSetImpl<const GlobalAlias*> &Visited,
645 const GlobalAlias &GA, const Constant &C) {
646 if (const auto *GV = dyn_cast<GlobalValue>(&C)) {
647 Assert(!GV->isDeclarationForLinker(), "Alias must point to a definition",do { if (!(!GV->isDeclarationForLinker())) { CheckFailed("Alias must point to a definition"
, &GA); return; } } while (0)
648 &GA)do { if (!(!GV->isDeclarationForLinker())) { CheckFailed("Alias must point to a definition"
, &GA); return; } } while (0)
;
649
650 if (const auto *GA2 = dyn_cast<GlobalAlias>(GV)) {
651 Assert(Visited.insert(GA2).second, "Aliases cannot form a cycle", &GA)do { if (!(Visited.insert(GA2).second)) { CheckFailed("Aliases cannot form a cycle"
, &GA); return; } } while (0)
;
652
653 Assert(!GA2->isInterposable(), "Alias cannot point to an interposable alias",do { if (!(!GA2->isInterposable())) { CheckFailed("Alias cannot point to an interposable alias"
, &GA); return; } } while (0)
654 &GA)do { if (!(!GA2->isInterposable())) { CheckFailed("Alias cannot point to an interposable alias"
, &GA); return; } } while (0)
;
655 } else {
656 // Only continue verifying subexpressions of GlobalAliases.
657 // Do not recurse into global initializers.
658 return;
659 }
660 }
661
662 if (const auto *CE = dyn_cast<ConstantExpr>(&C))
663 visitConstantExprsRecursively(CE);
664
665 for (const Use &U : C.operands()) {
666 Value *V = &*U;
667 if (const auto *GA2 = dyn_cast<GlobalAlias>(V))
668 visitAliaseeSubExpr(Visited, GA, *GA2->getAliasee());
669 else if (const auto *C2 = dyn_cast<Constant>(V))
670 visitAliaseeSubExpr(Visited, GA, *C2);
671 }
672}
673
674void Verifier::visitGlobalAlias(const GlobalAlias &GA) {
675 Assert(GlobalAlias::isValidLinkage(GA.getLinkage()),do { if (!(GlobalAlias::isValidLinkage(GA.getLinkage()))) { CheckFailed
("Alias should have private, internal, linkonce, weak, linkonce_odr, "
"weak_odr, or external linkage!", &GA); return; } } while
(0)
676 "Alias should have private, internal, linkonce, weak, linkonce_odr, "do { if (!(GlobalAlias::isValidLinkage(GA.getLinkage()))) { CheckFailed
("Alias should have private, internal, linkonce, weak, linkonce_odr, "
"weak_odr, or external linkage!", &GA); return; } } while
(0)
677 "weak_odr, or external linkage!",do { if (!(GlobalAlias::isValidLinkage(GA.getLinkage()))) { CheckFailed
("Alias should have private, internal, linkonce, weak, linkonce_odr, "
"weak_odr, or external linkage!", &GA); return; } } while
(0)
678 &GA)do { if (!(GlobalAlias::isValidLinkage(GA.getLinkage()))) { CheckFailed
("Alias should have private, internal, linkonce, weak, linkonce_odr, "
"weak_odr, or external linkage!", &GA); return; } } while
(0)
;
679 const Constant *Aliasee = GA.getAliasee();
680 Assert(Aliasee, "Aliasee cannot be NULL!", &GA)do { if (!(Aliasee)) { CheckFailed("Aliasee cannot be NULL!",
&GA); return; } } while (0)
;
681 Assert(GA.getType() == Aliasee->getType(),do { if (!(GA.getType() == Aliasee->getType())) { CheckFailed
("Alias and aliasee types should match!", &GA); return; }
} while (0)
682 "Alias and aliasee types should match!", &GA)do { if (!(GA.getType() == Aliasee->getType())) { CheckFailed
("Alias and aliasee types should match!", &GA); return; }
} while (0)
;
683
684 Assert(isa<GlobalValue>(Aliasee) || isa<ConstantExpr>(Aliasee),do { if (!(isa<GlobalValue>(Aliasee) || isa<ConstantExpr
>(Aliasee))) { CheckFailed("Aliasee should be either GlobalValue or ConstantExpr"
, &GA); return; } } while (0)
685 "Aliasee should be either GlobalValue or ConstantExpr", &GA)do { if (!(isa<GlobalValue>(Aliasee) || isa<ConstantExpr
>(Aliasee))) { CheckFailed("Aliasee should be either GlobalValue or ConstantExpr"
, &GA); return; } } while (0)
;
686
687 visitAliaseeSubExpr(GA, *Aliasee);
688
689 visitGlobalValue(GA);
690}
691
692void Verifier::visitNamedMDNode(const NamedMDNode &NMD) {
693 for (const MDNode *MD : NMD.operands()) {
694 if (NMD.getName() == "llvm.dbg.cu") {
695 AssertDI(MD && isa<DICompileUnit>(MD), "invalid compile unit", &NMD, MD)do { if (!(MD && isa<DICompileUnit>(MD))) { DebugInfoCheckFailed
("invalid compile unit", &NMD, MD); return; } } while (0)
;
696 }
697
698 if (!MD)
699 continue;
700
701 visitMDNode(*MD);
702 }
703}
704
705void Verifier::visitMDNode(const MDNode &MD) {
706 // Only visit each node once. Metadata can be mutually recursive, so this
707 // avoids infinite recursion here, as well as being an optimization.
708 if (!MDNodes.insert(&MD).second)
709 return;
710
711 switch (MD.getMetadataID()) {
712 default:
713 llvm_unreachable("Invalid MDNode subclass")::llvm::llvm_unreachable_internal("Invalid MDNode subclass", "/tmp/buildd/llvm-toolchain-snapshot-3.9~svn271203/lib/IR/Verifier.cpp"
, 713)
;
714 case Metadata::MDTupleKind:
715 break;
716#define HANDLE_SPECIALIZED_MDNODE_LEAF(CLASS) \
717 case Metadata::CLASS##Kind: \
718 visit##CLASS(cast<CLASS>(MD)); \
719 break;
720#include "llvm/IR/Metadata.def"
721 }
722
723 for (const Metadata *Op : MD.operands()) {
724 if (!Op)
725 continue;
726 Assert(!isa<LocalAsMetadata>(Op), "Invalid operand for global metadata!",do { if (!(!isa<LocalAsMetadata>(Op))) { CheckFailed("Invalid operand for global metadata!"
, &MD, Op); return; } } while (0)
727 &MD, Op)do { if (!(!isa<LocalAsMetadata>(Op))) { CheckFailed("Invalid operand for global metadata!"
, &MD, Op); return; } } while (0)
;
728 if (auto *N = dyn_cast<MDNode>(Op)) {
729 visitMDNode(*N);
730 continue;
731 }
732 if (auto *V = dyn_cast<ValueAsMetadata>(Op)) {
733 visitValueAsMetadata(*V, nullptr);
734 continue;
735 }
736 }
737
738 // Check these last, so we diagnose problems in operands first.
739 Assert(!MD.isTemporary(), "Expected no forward declarations!", &MD)do { if (!(!MD.isTemporary())) { CheckFailed("Expected no forward declarations!"
, &MD); return; } } while (0)
;
740 Assert(MD.isResolved(), "All nodes should be resolved!", &MD)do { if (!(MD.isResolved())) { CheckFailed("All nodes should be resolved!"
, &MD); return; } } while (0)
;
741}
742
743void Verifier::visitValueAsMetadata(const ValueAsMetadata &MD, Function *F) {
744 Assert(MD.getValue(), "Expected valid value", &MD)do { if (!(MD.getValue())) { CheckFailed("Expected valid value"
, &MD); return; } } while (0)
;
745 Assert(!MD.getValue()->getType()->isMetadataTy(),do { if (!(!MD.getValue()->getType()->isMetadataTy())) {
CheckFailed("Unexpected metadata round-trip through values",
&MD, MD.getValue()); return; } } while (0)
746 "Unexpected metadata round-trip through values", &MD, MD.getValue())do { if (!(!MD.getValue()->getType()->isMetadataTy())) {
CheckFailed("Unexpected metadata round-trip through values",
&MD, MD.getValue()); return; } } while (0)
;
747
748 auto *L = dyn_cast<LocalAsMetadata>(&MD);
749 if (!L)
750 return;
751
752 Assert(F, "function-local metadata used outside a function", L)do { if (!(F)) { CheckFailed("function-local metadata used outside a function"
, L); return; } } while (0)
;
753
754 // If this was an instruction, bb, or argument, verify that it is in the
755 // function that we expect.
756 Function *ActualF = nullptr;
757 if (Instruction *I = dyn_cast<Instruction>(L->getValue())) {
758 Assert(I->getParent(), "function-local metadata not in basic block", L, I)do { if (!(I->getParent())) { CheckFailed("function-local metadata not in basic block"
, L, I); return; } } while (0)
;
759 ActualF = I->getParent()->getParent();
760 } else if (BasicBlock *BB = dyn_cast<BasicBlock>(L->getValue()))
761 ActualF = BB->getParent();
762 else if (Argument *A = dyn_cast<Argument>(L->getValue()))
763 ActualF = A->getParent();
764 assert(ActualF && "Unimplemented function local metadata case!")((ActualF && "Unimplemented function local metadata case!"
) ? static_cast<void> (0) : __assert_fail ("ActualF && \"Unimplemented function local metadata case!\""
, "/tmp/buildd/llvm-toolchain-snapshot-3.9~svn271203/lib/IR/Verifier.cpp"
, 764, __PRETTY_FUNCTION__))
;
765
766 Assert(ActualF == F, "function-local metadata used in wrong function", L)do { if (!(ActualF == F)) { CheckFailed("function-local metadata used in wrong function"
, L); return; } } while (0)
;
767}
768
769void Verifier::visitMetadataAsValue(const MetadataAsValue &MDV, Function *F) {
770 Metadata *MD = MDV.getMetadata();
771 if (auto *N = dyn_cast<MDNode>(MD)) {
772 visitMDNode(*N);
773 return;
774 }
775
776 // Only visit each node once. Metadata can be mutually recursive, so this
777 // avoids infinite recursion here, as well as being an optimization.
778 if (!MDNodes.insert(MD).second)
779 return;
780
781 if (auto *V = dyn_cast<ValueAsMetadata>(MD))
782 visitValueAsMetadata(*V, F);
783}
784
785static bool isType(const Metadata *MD) { return !MD || isa<DIType>(MD); }
786static bool isScope(const Metadata *MD) { return !MD || isa<DIScope>(MD); }
787static bool isDINode(const Metadata *MD) { return !MD || isa<DINode>(MD); }
788
789template <class Ty>
790bool isValidMetadataArrayImpl(const MDTuple &N, bool AllowNull) {
791 for (Metadata *MD : N.operands()) {
792 if (MD) {
793 if (!isa<Ty>(MD))
794 return false;
795 } else {
796 if (!AllowNull)
797 return false;
798 }
799 }
800 return true;
801}
802
803template <class Ty>
804bool isValidMetadataArray(const MDTuple &N) {
805 return isValidMetadataArrayImpl<Ty>(N, /* AllowNull */ false);
806}
807
808template <class Ty>
809bool isValidMetadataNullArray(const MDTuple &N) {
810 return isValidMetadataArrayImpl<Ty>(N, /* AllowNull */ true);
811}
812
813void Verifier::visitDILocation(const DILocation &N) {
814 AssertDI(N.getRawScope() && isa<DILocalScope>(N.getRawScope()),do { if (!(N.getRawScope() && isa<DILocalScope>
(N.getRawScope()))) { DebugInfoCheckFailed("location requires a valid scope"
, &N, N.getRawScope()); return; } } while (0)
815 "location requires a valid scope", &N, N.getRawScope())do { if (!(N.getRawScope() && isa<DILocalScope>
(N.getRawScope()))) { DebugInfoCheckFailed("location requires a valid scope"
, &N, N.getRawScope()); return; } } while (0)
;
816 if (auto *IA = N.getRawInlinedAt())
817 AssertDI(isa<DILocation>(IA), "inlined-at should be a location", &N, IA)do { if (!(isa<DILocation>(IA))) { DebugInfoCheckFailed
("inlined-at should be a location", &N, IA); return; } } while
(0)
;
818}
819
820void Verifier::visitGenericDINode(const GenericDINode &N) {
821 AssertDI(N.getTag(), "invalid tag", &N)do { if (!(N.getTag())) { DebugInfoCheckFailed("invalid tag",
&N); return; } } while (0)
;
822}
823
824void Verifier::visitDIScope(const DIScope &N) {
825 if (auto *F = N.getRawFile())
826 AssertDI(isa<DIFile>(F), "invalid file", &N, F)do { if (!(isa<DIFile>(F))) { DebugInfoCheckFailed("invalid file"
, &N, F); return; } } while (0)
;
827}
828
829void Verifier::visitDISubrange(const DISubrange &N) {
830 AssertDI(N.getTag() == dwarf::DW_TAG_subrange_type, "invalid tag", &N)do { if (!(N.getTag() == dwarf::DW_TAG_subrange_type)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (0)
;
831 AssertDI(N.getCount() >= -1, "invalid subrange count", &N)do { if (!(N.getCount() >= -1)) { DebugInfoCheckFailed("invalid subrange count"
, &N); return; } } while (0)
;
832}
833
834void Verifier::visitDIEnumerator(const DIEnumerator &N) {
835 AssertDI(N.getTag() == dwarf::DW_TAG_enumerator, "invalid tag", &N)do { if (!(N.getTag() == dwarf::DW_TAG_enumerator)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (0)
;
836}
837
838void Verifier::visitDIBasicType(const DIBasicType &N) {
839 AssertDI(N.getTag() == dwarf::DW_TAG_base_type ||do { if (!(N.getTag() == dwarf::DW_TAG_base_type || N.getTag(
) == dwarf::DW_TAG_unspecified_type)) { DebugInfoCheckFailed(
"invalid tag", &N); return; } } while (0)
840 N.getTag() == dwarf::DW_TAG_unspecified_type,do { if (!(N.getTag() == dwarf::DW_TAG_base_type || N.getTag(
) == dwarf::DW_TAG_unspecified_type)) { DebugInfoCheckFailed(
"invalid tag", &N); return; } } while (0)
841 "invalid tag", &N)do { if (!(N.getTag() == dwarf::DW_TAG_base_type || N.getTag(
) == dwarf::DW_TAG_unspecified_type)) { DebugInfoCheckFailed(
"invalid tag", &N); return; } } while (0)
;
842}
843
844void Verifier::visitDIDerivedType(const DIDerivedType &N) {
845 // Common scope checks.
846 visitDIScope(N);
847
848 AssertDI(N.getTag() == dwarf::DW_TAG_typedef ||do { if (!(N.getTag() == dwarf::DW_TAG_typedef || N.getTag() ==
dwarf::DW_TAG_pointer_type || N.getTag() == dwarf::DW_TAG_ptr_to_member_type
|| N.getTag() == dwarf::DW_TAG_reference_type || N.getTag() ==
dwarf::DW_TAG_rvalue_reference_type || N.getTag() == dwarf::
DW_TAG_const_type || N.getTag() == dwarf::DW_TAG_volatile_type
|| N.getTag() == dwarf::DW_TAG_restrict_type || N.getTag() ==
dwarf::DW_TAG_member || N.getTag() == dwarf::DW_TAG_inheritance
|| N.getTag() == dwarf::DW_TAG_friend)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (0)
849 N.getTag() == dwarf::DW_TAG_pointer_type ||do { if (!(N.getTag() == dwarf::DW_TAG_typedef || N.getTag() ==
dwarf::DW_TAG_pointer_type || N.getTag() == dwarf::DW_TAG_ptr_to_member_type
|| N.getTag() == dwarf::DW_TAG_reference_type || N.getTag() ==
dwarf::DW_TAG_rvalue_reference_type || N.getTag() == dwarf::
DW_TAG_const_type || N.getTag() == dwarf::DW_TAG_volatile_type
|| N.getTag() == dwarf::DW_TAG_restrict_type || N.getTag() ==
dwarf::DW_TAG_member || N.getTag() == dwarf::DW_TAG_inheritance
|| N.getTag() == dwarf::DW_TAG_friend)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (0)
850 N.getTag() == dwarf::DW_TAG_ptr_to_member_type ||do { if (!(N.getTag() == dwarf::DW_TAG_typedef || N.getTag() ==
dwarf::DW_TAG_pointer_type || N.getTag() == dwarf::DW_TAG_ptr_to_member_type
|| N.getTag() == dwarf::DW_TAG_reference_type || N.getTag() ==
dwarf::DW_TAG_rvalue_reference_type || N.getTag() == dwarf::
DW_TAG_const_type || N.getTag() == dwarf::DW_TAG_volatile_type
|| N.getTag() == dwarf::DW_TAG_restrict_type || N.getTag() ==
dwarf::DW_TAG_member || N.getTag() == dwarf::DW_TAG_inheritance
|| N.getTag() == dwarf::DW_TAG_friend)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (0)
851 N.getTag() == dwarf::DW_TAG_reference_type ||do { if (!(N.getTag() == dwarf::DW_TAG_typedef || N.getTag() ==
dwarf::DW_TAG_pointer_type || N.getTag() == dwarf::DW_TAG_ptr_to_member_type
|| N.getTag() == dwarf::DW_TAG_reference_type || N.getTag() ==
dwarf::DW_TAG_rvalue_reference_type || N.getTag() == dwarf::
DW_TAG_const_type || N.getTag() == dwarf::DW_TAG_volatile_type
|| N.getTag() == dwarf::DW_TAG_restrict_type || N.getTag() ==
dwarf::DW_TAG_member || N.getTag() == dwarf::DW_TAG_inheritance
|| N.getTag() == dwarf::DW_TAG_friend)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (0)
852 N.getTag() == dwarf::DW_TAG_rvalue_reference_type ||do { if (!(N.getTag() == dwarf::DW_TAG_typedef || N.getTag() ==
dwarf::DW_TAG_pointer_type || N.getTag() == dwarf::DW_TAG_ptr_to_member_type
|| N.getTag() == dwarf::DW_TAG_reference_type || N.getTag() ==
dwarf::DW_TAG_rvalue_reference_type || N.getTag() == dwarf::
DW_TAG_const_type || N.getTag() == dwarf::DW_TAG_volatile_type
|| N.getTag() == dwarf::DW_TAG_restrict_type || N.getTag() ==
dwarf::DW_TAG_member || N.getTag() == dwarf::DW_TAG_inheritance
|| N.getTag() == dwarf::DW_TAG_friend)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (0)
853 N.getTag() == dwarf::DW_TAG_const_type ||do { if (!(N.getTag() == dwarf::DW_TAG_typedef || N.getTag() ==
dwarf::DW_TAG_pointer_type || N.getTag() == dwarf::DW_TAG_ptr_to_member_type
|| N.getTag() == dwarf::DW_TAG_reference_type || N.getTag() ==
dwarf::DW_TAG_rvalue_reference_type || N.getTag() == dwarf::
DW_TAG_const_type || N.getTag() == dwarf::DW_TAG_volatile_type
|| N.getTag() == dwarf::DW_TAG_restrict_type || N.getTag() ==
dwarf::DW_TAG_member || N.getTag() == dwarf::DW_TAG_inheritance
|| N.getTag() == dwarf::DW_TAG_friend)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (0)
854 N.getTag() == dwarf::DW_TAG_volatile_type ||do { if (!(N.getTag() == dwarf::DW_TAG_typedef || N.getTag() ==
dwarf::DW_TAG_pointer_type || N.getTag() == dwarf::DW_TAG_ptr_to_member_type
|| N.getTag() == dwarf::DW_TAG_reference_type || N.getTag() ==
dwarf::DW_TAG_rvalue_reference_type || N.getTag() == dwarf::
DW_TAG_const_type || N.getTag() == dwarf::DW_TAG_volatile_type
|| N.getTag() == dwarf::DW_TAG_restrict_type || N.getTag() ==
dwarf::DW_TAG_member || N.getTag() == dwarf::DW_TAG_inheritance
|| N.getTag() == dwarf::DW_TAG_friend)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (0)
855 N.getTag() == dwarf::DW_TAG_restrict_type ||do { if (!(N.getTag() == dwarf::DW_TAG_typedef || N.getTag() ==
dwarf::DW_TAG_pointer_type || N.getTag() == dwarf::DW_TAG_ptr_to_member_type
|| N.getTag() == dwarf::DW_TAG_reference_type || N.getTag() ==
dwarf::DW_TAG_rvalue_reference_type || N.getTag() == dwarf::
DW_TAG_const_type || N.getTag() == dwarf::DW_TAG_volatile_type
|| N.getTag() == dwarf::DW_TAG_restrict_type || N.getTag() ==
dwarf::DW_TAG_member || N.getTag() == dwarf::DW_TAG_inheritance
|| N.getTag() == dwarf::DW_TAG_friend)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (0)
856 N.getTag() == dwarf::DW_TAG_member ||do { if (!(N.getTag() == dwarf::DW_TAG_typedef || N.getTag() ==
dwarf::DW_TAG_pointer_type || N.getTag() == dwarf::DW_TAG_ptr_to_member_type
|| N.getTag() == dwarf::DW_TAG_reference_type || N.getTag() ==
dwarf::DW_TAG_rvalue_reference_type || N.getTag() == dwarf::
DW_TAG_const_type || N.getTag() == dwarf::DW_TAG_volatile_type
|| N.getTag() == dwarf::DW_TAG_restrict_type || N.getTag() ==
dwarf::DW_TAG_member || N.getTag() == dwarf::DW_TAG_inheritance
|| N.getTag() == dwarf::DW_TAG_friend)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (0)
857 N.getTag() == dwarf::DW_TAG_inheritance ||do { if (!(N.getTag() == dwarf::DW_TAG_typedef || N.getTag() ==
dwarf::DW_TAG_pointer_type || N.getTag() == dwarf::DW_TAG_ptr_to_member_type
|| N.getTag() == dwarf::DW_TAG_reference_type || N.getTag() ==
dwarf::DW_TAG_rvalue_reference_type || N.getTag() == dwarf::
DW_TAG_const_type || N.getTag() == dwarf::DW_TAG_volatile_type
|| N.getTag() == dwarf::DW_TAG_restrict_type || N.getTag() ==
dwarf::DW_TAG_member || N.getTag() == dwarf::DW_TAG_inheritance
|| N.getTag() == dwarf::DW_TAG_friend)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (0)
858 N.getTag() == dwarf::DW_TAG_friend,do { if (!(N.getTag() == dwarf::DW_TAG_typedef || N.getTag() ==
dwarf::DW_TAG_pointer_type || N.getTag() == dwarf::DW_TAG_ptr_to_member_type
|| N.getTag() == dwarf::DW_TAG_reference_type || N.getTag() ==
dwarf::DW_TAG_rvalue_reference_type || N.getTag() == dwarf::
DW_TAG_const_type || N.getTag() == dwarf::DW_TAG_volatile_type
|| N.getTag() == dwarf::DW_TAG_restrict_type || N.getTag() ==
dwarf::DW_TAG_member || N.getTag() == dwarf::DW_TAG_inheritance
|| N.getTag() == dwarf::DW_TAG_friend)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (0)
859 "invalid tag", &N)do { if (!(N.getTag() == dwarf::DW_TAG_typedef || N.getTag() ==
dwarf::DW_TAG_pointer_type || N.getTag() == dwarf::DW_TAG_ptr_to_member_type
|| N.getTag() == dwarf::DW_TAG_reference_type || N.getTag() ==
dwarf::DW_TAG_rvalue_reference_type || N.getTag() == dwarf::
DW_TAG_const_type || N.getTag() == dwarf::DW_TAG_volatile_type
|| N.getTag() == dwarf::DW_TAG_restrict_type || N.getTag() ==
dwarf::DW_TAG_member || N.getTag() == dwarf::DW_TAG_inheritance
|| N.getTag() == dwarf::DW_TAG_friend)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (0)
;
860 if (N.getTag() == dwarf::DW_TAG_ptr_to_member_type) {
861 AssertDI(isType(N.getRawExtraData()), "invalid pointer to member type", &N,do { if (!(isType(N.getRawExtraData()))) { DebugInfoCheckFailed
("invalid pointer to member type", &N, N.getRawExtraData(
)); return; } } while (0)
862 N.getRawExtraData())do { if (!(isType(N.getRawExtraData()))) { DebugInfoCheckFailed
("invalid pointer to member type", &N, N.getRawExtraData(
)); return; } } while (0)
;
863 }
864
865 AssertDI(isScope(N.getRawScope()), "invalid scope", &N, N.getRawScope())do { if (!(isScope(N.getRawScope()))) { DebugInfoCheckFailed(
"invalid scope", &N, N.getRawScope()); return; } } while (
0)
;
866 AssertDI(isType(N.getRawBaseType()), "invalid base type", &N,do { if (!(isType(N.getRawBaseType()))) { DebugInfoCheckFailed
("invalid base type", &N, N.getRawBaseType()); return; } }
while (0)
867 N.getRawBaseType())do { if (!(isType(N.getRawBaseType()))) { DebugInfoCheckFailed
("invalid base type", &N, N.getRawBaseType()); return; } }
while (0)
;
868}
869
870static bool hasConflictingReferenceFlags(unsigned Flags) {
871 return (Flags & DINode::FlagLValueReference) &&
872 (Flags & DINode::FlagRValueReference);
873}
874
875void Verifier::visitTemplateParams(const MDNode &N, const Metadata &RawParams) {
876 auto *Params = dyn_cast<MDTuple>(&RawParams);
877 AssertDI(Params, "invalid template params", &N, &RawParams)do { if (!(Params)) { DebugInfoCheckFailed("invalid template params"
, &N, &RawParams); return; } } while (0)
;
878 for (Metadata *Op : Params->operands()) {
879 AssertDI(Op && isa<DITemplateParameter>(Op), "invalid template parameter",do { if (!(Op && isa<DITemplateParameter>(Op)))
{ DebugInfoCheckFailed("invalid template parameter", &N,
Params, Op); return; } } while (0)
880 &N, Params, Op)do { if (!(Op && isa<DITemplateParameter>(Op)))
{ DebugInfoCheckFailed("invalid template parameter", &N,
Params, Op); return; } } while (0)
;
881 }
882}
883
884void Verifier::visitDICompositeType(const DICompositeType &N) {
885 // Common scope checks.
886 visitDIScope(N);
887
888 AssertDI(N.getTag() == dwarf::DW_TAG_array_type ||do { if (!(N.getTag() == dwarf::DW_TAG_array_type || N.getTag
() == dwarf::DW_TAG_structure_type || N.getTag() == dwarf::DW_TAG_union_type
|| N.getTag() == dwarf::DW_TAG_enumeration_type || N.getTag(
) == dwarf::DW_TAG_class_type)) { DebugInfoCheckFailed("invalid tag"
, &N); return; } } while (0)
889 N.getTag() == dwarf::DW_TAG_structure_type ||do { if (!(N.getTag() == dwarf::DW_TAG_array_type || N.getTag
() == dwarf::DW_TAG_structure_type || N.getTag() == dwarf::DW_TAG_union_type
|| N.getTag() == dwarf::DW_TAG_enumeration_type || N.getTag(
) == dwarf::DW_TAG_class_type)) { DebugInfoCheckFailed("invalid tag"
, &N); return; } } while (0)
890 N.getTag() == dwarf::DW_TAG_union_type ||do { if (!(N.getTag() == dwarf::DW_TAG_array_type || N.getTag
() == dwarf::DW_TAG_structure_type || N.getTag() == dwarf::DW_TAG_union_type
|| N.getTag() == dwarf::DW_TAG_enumeration_type || N.getTag(
) == dwarf::DW_TAG_class_type)) { DebugInfoCheckFailed("invalid tag"
, &N); return; } } while (0)
891 N.getTag() == dwarf::DW_TAG_enumeration_type ||do { if (!(N.getTag() == dwarf::DW_TAG_array_type || N.getTag
() == dwarf::DW_TAG_structure_type || N.getTag() == dwarf::DW_TAG_union_type
|| N.getTag() == dwarf::DW_TAG_enumeration_type || N.getTag(
) == dwarf::DW_TAG_class_type)) { DebugInfoCheckFailed("invalid tag"
, &N); return; } } while (0)
892 N.getTag() == dwarf::DW_TAG_class_type,do { if (!(N.getTag() == dwarf::DW_TAG_array_type || N.getTag
() == dwarf::DW_TAG_structure_type || N.getTag() == dwarf::DW_TAG_union_type
|| N.getTag() == dwarf::DW_TAG_enumeration_type || N.getTag(
) == dwarf::DW_TAG_class_type)) { DebugInfoCheckFailed("invalid tag"
, &N); return; } } while (0)
893 "invalid tag", &N)do { if (!(N.getTag() == dwarf::DW_TAG_array_type || N.getTag
() == dwarf::DW_TAG_structure_type || N.getTag() == dwarf::DW_TAG_union_type
|| N.getTag() == dwarf::DW_TAG_enumeration_type || N.getTag(
) == dwarf::DW_TAG_class_type)) { DebugInfoCheckFailed("invalid tag"
, &N); return; } } while (0)
;
894
895 AssertDI(isScope(N.getRawScope()), "invalid scope", &N, N.getRawScope())do { if (!(isScope(N.getRawScope()))) { DebugInfoCheckFailed(
"invalid scope", &N, N.getRawScope()); return; } } while (
0)
;
896 AssertDI(isType(N.getRawBaseType()), "invalid base type", &N,do { if (!(isType(N.getRawBaseType()))) { DebugInfoCheckFailed
("invalid base type", &N, N.getRawBaseType()); return; } }
while (0)
897 N.getRawBaseType())do { if (!(isType(N.getRawBaseType()))) { DebugInfoCheckFailed
("invalid base type", &N, N.getRawBaseType()); return; } }
while (0)
;
898
899 AssertDI(!N.getRawElements() || isa<MDTuple>(N.getRawElements()),do { if (!(!N.getRawElements() || isa<MDTuple>(N.getRawElements
()))) { DebugInfoCheckFailed("invalid composite elements", &
N, N.getRawElements()); return; } } while (0)
900 "invalid composite elements", &N, N.getRawElements())do { if (!(!N.getRawElements() || isa<MDTuple>(N.getRawElements
()))) { DebugInfoCheckFailed("invalid composite elements", &
N, N.getRawElements()); return; } } while (0)
;
901 AssertDI(isType(N.getRawVTableHolder()), "invalid vtable holder", &N,do { if (!(isType(N.getRawVTableHolder()))) { DebugInfoCheckFailed
("invalid vtable holder", &N, N.getRawVTableHolder()); return
; } } while (0)
902 N.getRawVTableHolder())do { if (!(isType(N.getRawVTableHolder()))) { DebugInfoCheckFailed
("invalid vtable holder", &N, N.getRawVTableHolder()); return
; } } while (0)
;
903 AssertDI(!hasConflictingReferenceFlags(N.getFlags()),do { if (!(!hasConflictingReferenceFlags(N.getFlags()))) { DebugInfoCheckFailed
("invalid reference flags", &N); return; } } while (0)
904 "invalid reference flags", &N)do { if (!(!hasConflictingReferenceFlags(N.getFlags()))) { DebugInfoCheckFailed
("invalid reference flags", &N); return; } } while (0)
;
905 if (auto *Params = N.getRawTemplateParams())
906 visitTemplateParams(N, *Params);
907
908 if (N.getTag() == dwarf::DW_TAG_class_type ||
909 N.getTag() == dwarf::DW_TAG_union_type) {
910 AssertDI(N.getFile() && !N.getFile()->getFilename().empty(),do { if (!(N.getFile() && !N.getFile()->getFilename
().empty())) { DebugInfoCheckFailed("class/union requires a filename"
, &N, N.getFile()); return; } } while (0)
911 "class/union requires a filename", &N, N.getFile())do { if (!(N.getFile() && !N.getFile()->getFilename
().empty())) { DebugInfoCheckFailed("class/union requires a filename"
, &N, N.getFile()); return; } } while (0)
;
912 }
913}
914
915void Verifier::visitDISubroutineType(const DISubroutineType &N) {
916 AssertDI(N.getTag() == dwarf::DW_TAG_subroutine_type, "invalid tag", &N)do { if (!(N.getTag() == dwarf::DW_TAG_subroutine_type)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (0)
;
917 if (auto *Types = N.getRawTypeArray()) {
918 AssertDI(isa<MDTuple>(Types), "invalid composite elements", &N, Types)do { if (!(isa<MDTuple>(Types))) { DebugInfoCheckFailed
("invalid composite elements", &N, Types); return; } } while
(0)
;
919 for (Metadata *Ty : N.getTypeArray()->operands()) {
920 AssertDI(isType(Ty), "invalid subroutine type ref", &N, Types, Ty)do { if (!(isType(Ty))) { DebugInfoCheckFailed("invalid subroutine type ref"
, &N, Types, Ty); return; } } while (0)
;
921 }
922 }
923 AssertDI(!hasConflictingReferenceFlags(N.getFlags()),do { if (!(!hasConflictingReferenceFlags(N.getFlags()))) { DebugInfoCheckFailed
("invalid reference flags", &N); return; } } while (0)
924 "invalid reference flags", &N)do { if (!(!hasConflictingReferenceFlags(N.getFlags()))) { DebugInfoCheckFailed
("invalid reference flags", &N); return; } } while (0)
;
925}
926
927void Verifier::visitDIFile(const DIFile &N) {
928 AssertDI(N.getTag() == dwarf::DW_TAG_file_type, "invalid tag", &N)do { if (!(N.getTag() == dwarf::DW_TAG_file_type)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (0)
;
929}
930
931void Verifier::visitDICompileUnit(const DICompileUnit &N) {
932 AssertDI(N.isDistinct(), "compile units must be distinct", &N)do { if (!(N.isDistinct())) { DebugInfoCheckFailed("compile units must be distinct"
, &N); return; } } while (0)
;
933 AssertDI(N.getTag() == dwarf::DW_TAG_compile_unit, "invalid tag", &N)do { if (!(N.getTag() == dwarf::DW_TAG_compile_unit)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (0)
;
934
935 // Don't bother verifying the compilation directory or producer string
936 // as those could be empty.
937 AssertDI(N.getRawFile() && isa<DIFile>(N.getRawFile()), "invalid file", &N,do { if (!(N.getRawFile() && isa<DIFile>(N.getRawFile
()))) { DebugInfoCheckFailed("invalid file", &N, N.getRawFile
()); return; } } while (0)
938 N.getRawFile())do { if (!(N.getRawFile() && isa<DIFile>(N.getRawFile
()))) { DebugInfoCheckFailed("invalid file", &N, N.getRawFile
()); return; } } while (0)
;
939 AssertDI(!N.getFile()->getFilename().empty(), "invalid filename", &N,do { if (!(!N.getFile()->getFilename().empty())) { DebugInfoCheckFailed
("invalid filename", &N, N.getFile()); return; } } while (
0)
940 N.getFile())do { if (!(!N.getFile()->getFilename().empty())) { DebugInfoCheckFailed
("invalid filename", &N, N.getFile()); return; } } while (
0)
;
941
942 AssertDI((N.getEmissionKind() <= DICompileUnit::LastEmissionKind),do { if (!((N.getEmissionKind() <= DICompileUnit::LastEmissionKind
))) { DebugInfoCheckFailed("invalid emission kind", &N); return
; } } while (0)
943 "invalid emission kind", &N)do { if (!((N.getEmissionKind() <= DICompileUnit::LastEmissionKind
))) { DebugInfoCheckFailed("invalid emission kind", &N); return
; } } while (0)
;
944
945 if (auto *Array = N.getRawEnumTypes()) {
946 AssertDI(isa<MDTuple>(Array), "invalid enum list", &N, Array)do { if (!(isa<MDTuple>(Array))) { DebugInfoCheckFailed
("invalid enum list", &N, Array); return; } } while (0)
;
947 for (Metadata *Op : N.getEnumTypes()->operands()) {
948 auto *Enum = dyn_cast_or_null<DICompositeType>(Op);
949 AssertDI(Enum && Enum->getTag() == dwarf::DW_TAG_enumeration_type,do { if (!(Enum && Enum->getTag() == dwarf::DW_TAG_enumeration_type
)) { DebugInfoCheckFailed("invalid enum type", &N, N.getEnumTypes
(), Op); return; } } while (0)
950 "invalid enum type", &N, N.getEnumTypes(), Op)do { if (!(Enum && Enum->getTag() == dwarf::DW_TAG_enumeration_type
)) { DebugInfoCheckFailed("invalid enum type", &N, N.getEnumTypes
(), Op); return; } } while (0)
;
951 }
952 }
953 if (auto *Array = N.getRawRetainedTypes()) {
954 AssertDI(isa<MDTuple>(Array), "invalid retained type list", &N, Array)do { if (!(isa<MDTuple>(Array))) { DebugInfoCheckFailed
("invalid retained type list", &N, Array); return; } } while
(0)
;
955 for (Metadata *Op : N.getRetainedTypes()->operands()) {
956 AssertDI(Op && (isa<DIType>(Op) ||do { if (!(Op && (isa<DIType>(Op) || (isa<DISubprogram
>(Op) && cast<DISubprogram>(Op)->isDefinition
() == false)))) { DebugInfoCheckFailed("invalid retained type"
, &N, Op); return; } } while (0)
957 (isa<DISubprogram>(Op) &&do { if (!(Op && (isa<DIType>(Op) || (isa<DISubprogram
>(Op) && cast<DISubprogram>(Op)->isDefinition
() == false)))) { DebugInfoCheckFailed("invalid retained type"
, &N, Op); return; } } while (0)
958 cast<DISubprogram>(Op)->isDefinition() == false)),do { if (!(Op && (isa<DIType>(Op) || (isa<DISubprogram
>(Op) && cast<DISubprogram>(Op)->isDefinition
() == false)))) { DebugInfoCheckFailed("invalid retained type"
, &N, Op); return; } } while (0)
959 "invalid retained type", &N, Op)do { if (!(Op && (isa<DIType>(Op) || (isa<DISubprogram
>(Op) && cast<DISubprogram>(Op)->isDefinition
() == false)))) { DebugInfoCheckFailed("invalid retained type"
, &N, Op); return; } } while (0)
;
960 }
961 }
962 if (auto *Array = N.getRawGlobalVariables()) {
963 AssertDI(isa<MDTuple>(Array), "invalid global variable list", &N, Array)do { if (!(isa<MDTuple>(Array))) { DebugInfoCheckFailed
("invalid global variable list", &N, Array); return; } } while
(0)
;
964 for (Metadata *Op : N.getGlobalVariables()->operands()) {
965 AssertDI(Op && isa<DIGlobalVariable>(Op), "invalid global variable ref",do { if (!(Op && isa<DIGlobalVariable>(Op))) { DebugInfoCheckFailed
("invalid global variable ref", &N, Op); return; } } while
(0)
966 &N, Op)do { if (!(Op && isa<DIGlobalVariable>(Op))) { DebugInfoCheckFailed
("invalid global variable ref", &N, Op); return; } } while
(0)
;
967 }
968 }
969 if (auto *Array = N.getRawImportedEntities()) {
970 AssertDI(isa<MDTuple>(Array), "invalid imported entity list", &N, Array)do { if (!(isa<MDTuple>(Array))) { DebugInfoCheckFailed
("invalid imported entity list", &N, Array); return; } } while
(0)
;
971 for (Metadata *Op : N.getImportedEntities()->operands()) {
972 AssertDI(Op && isa<DIImportedEntity>(Op), "invalid imported entity ref",do { if (!(Op && isa<DIImportedEntity>(Op))) { DebugInfoCheckFailed
("invalid imported entity ref", &N, Op); return; } } while
(0)
973 &N, Op)do { if (!(Op && isa<DIImportedEntity>(Op))) { DebugInfoCheckFailed
("invalid imported entity ref", &N, Op); return; } } while
(0)
;
974 }
975 }
976 if (auto *Array = N.getRawMacros()) {
977 AssertDI(isa<MDTuple>(Array), "invalid macro list", &N, Array)do { if (!(isa<MDTuple>(Array))) { DebugInfoCheckFailed
("invalid macro list", &N, Array); return; } } while (0)
;
978 for (Metadata *Op : N.getMacros()->operands()) {
979 AssertDI(Op && isa<DIMacroNode>(Op), "invalid macro ref", &N, Op)do { if (!(Op && isa<DIMacroNode>(Op))) { DebugInfoCheckFailed
("invalid macro ref", &N, Op); return; } } while (0)
;
980 }
981 }
982 CUVisited.insert(&N);
983}
984
985void Verifier::visitDISubprogram(const DISubprogram &N) {
986 AssertDI(N.getTag() == dwarf::DW_TAG_subprogram, "invalid tag", &N)do { if (!(N.getTag() == dwarf::DW_TAG_subprogram)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (0)
;
987 AssertDI(isScope(N.getRawScope()), "invalid scope", &N, N.getRawScope())do { if (!(isScope(N.getRawScope()))) { DebugInfoCheckFailed(
"invalid scope", &N, N.getRawScope()); return; } } while (
0)
;
988 if (auto *F = N.getRawFile())
989 AssertDI(isa<DIFile>(F), "invalid file", &N, F)do { if (!(isa<DIFile>(F))) { DebugInfoCheckFailed("invalid file"
, &N, F); return; } } while (0)
;
990 if (auto *T = N.getRawType())
991 AssertDI(isa<DISubroutineType>(T), "invalid subroutine type", &N, T)do { if (!(isa<DISubroutineType>(T))) { DebugInfoCheckFailed
("invalid subroutine type", &N, T); return; } } while (0)
;
992 AssertDI(isType(N.getRawContainingType()), "invalid containing type", &N,do { if (!(isType(N.getRawContainingType()))) { DebugInfoCheckFailed
("invalid containing type", &N, N.getRawContainingType())
; return; } } while (0)
993 N.getRawContainingType())do { if (!(isType(N.getRawContainingType()))) { DebugInfoCheckFailed
("invalid containing type", &N, N.getRawContainingType())
; return; } } while (0)
;
994 if (auto *Params = N.getRawTemplateParams())
995 visitTemplateParams(N, *Params);
996 if (auto *S = N.getRawDeclaration())
997 AssertDI(isa<DISubprogram>(S) && !cast<DISubprogram>(S)->isDefinition(),do { if (!(isa<DISubprogram>(S) && !cast<DISubprogram
>(S)->isDefinition())) { DebugInfoCheckFailed("invalid subprogram declaration"
, &N, S); return; } } while (0)
998 "invalid subprogram declaration", &N, S)do { if (!(isa<DISubprogram>(S) && !cast<DISubprogram
>(S)->isDefinition())) { DebugInfoCheckFailed("invalid subprogram declaration"
, &N, S); return; } } while (0)
;
999 if (auto *RawVars = N.getRawVariables()) {
1000 auto *Vars = dyn_cast<MDTuple>(RawVars);
1001 AssertDI(Vars, "invalid variable list", &N, RawVars)do { if (!(Vars)) { DebugInfoCheckFailed("invalid variable list"
, &N, RawVars); return; } } while (0)
;
1002 for (Metadata *Op : Vars->operands()) {
1003 AssertDI(Op && isa<DILocalVariable>(Op), "invalid local variable", &N,do { if (!(Op && isa<DILocalVariable>(Op))) { DebugInfoCheckFailed
("invalid local variable", &N, Vars, Op); return; } } while
(0)
1004 Vars, Op)do { if (!(Op && isa<DILocalVariable>(Op))) { DebugInfoCheckFailed
("invalid local variable", &N, Vars, Op); return; } } while
(0)
;
1005 }
1006 }
1007 AssertDI(!hasConflictingReferenceFlags(N.getFlags()),do { if (!(!hasConflictingReferenceFlags(N.getFlags()))) { DebugInfoCheckFailed
("invalid reference flags", &N); return; } } while (0)
1008 "invalid reference flags", &N)do { if (!(!hasConflictingReferenceFlags(N.getFlags()))) { DebugInfoCheckFailed
("invalid reference flags", &N); return; } } while (0)
;
1009
1010 auto *Unit = N.getRawUnit();
1011 if (N.isDefinition()) {
1012 // Subprogram definitions (not part of the type hierarchy).
1013 AssertDI(N.isDistinct(), "subprogram definitions must be distinct", &N)do { if (!(N.isDistinct())) { DebugInfoCheckFailed("subprogram definitions must be distinct"
, &N); return; } } while (0)
;
1014 AssertDI(Unit, "subprogram definitions must have a compile unit", &N)do { if (!(Unit)) { DebugInfoCheckFailed("subprogram definitions must have a compile unit"
, &N); return; } } while (0)
;
1015 AssertDI(isa<DICompileUnit>(Unit), "invalid unit type", &N, Unit)do { if (!(isa<DICompileUnit>(Unit))) { DebugInfoCheckFailed
("invalid unit type", &N, Unit); return; } } while (0)
;
1016 } else {
1017 // Subprogram declarations (part of the type hierarchy).
1018 AssertDI(!Unit, "subprogram declarations must not have a compile unit", &N)do { if (!(!Unit)) { DebugInfoCheckFailed("subprogram declarations must not have a compile unit"
, &N); return; } } while (0)
;
1019 }
1020}
1021
1022void Verifier::visitDILexicalBlockBase(const DILexicalBlockBase &N) {
1023 AssertDI(N.getTag() == dwarf::DW_TAG_lexical_block, "invalid tag", &N)do { if (!(N.getTag() == dwarf::DW_TAG_lexical_block)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (0)
;
1024 AssertDI(N.getRawScope() && isa<DILocalScope>(N.getRawScope()),do { if (!(N.getRawScope() && isa<DILocalScope>
(N.getRawScope()))) { DebugInfoCheckFailed("invalid local scope"
, &N, N.getRawScope()); return; } } while (0)
1025 "invalid local scope", &N, N.getRawScope())do { if (!(N.getRawScope() && isa<DILocalScope>
(N.getRawScope()))) { DebugInfoCheckFailed("invalid local scope"
, &N, N.getRawScope()); return; } } while (0)
;
1026}
1027
1028void Verifier::visitDILexicalBlock(const DILexicalBlock &N) {
1029 visitDILexicalBlockBase(N);
1030
1031 AssertDI(N.getLine() || !N.getColumn(),do { if (!(N.getLine() || !N.getColumn())) { DebugInfoCheckFailed
("cannot have column info without line info", &N); return
; } } while (0)
1032 "cannot have column info without line info", &N)do { if (!(N.getLine() || !N.getColumn())) { DebugInfoCheckFailed
("cannot have column info without line info", &N); return
; } } while (0)
;
1033}
1034
1035void Verifier::visitDILexicalBlockFile(const DILexicalBlockFile &N) {
1036 visitDILexicalBlockBase(N);
1037}
1038
1039void Verifier::visitDINamespace(const DINamespace &N) {
1040 AssertDI(N.getTag() == dwarf::DW_TAG_namespace, "invalid tag", &N)do { if (!(N.getTag() == dwarf::DW_TAG_namespace)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (0)
;
1041 if (auto *S = N.getRawScope())
1042 AssertDI(isa<DIScope>(S), "invalid scope ref", &N, S)do { if (!(isa<DIScope>(S))) { DebugInfoCheckFailed("invalid scope ref"
, &N, S); return; } } while (0)
;
1043}
1044
1045void Verifier::visitDIMacro(const DIMacro &N) {
1046 AssertDI(N.getMacinfoType() == dwarf::DW_MACINFO_define ||do { if (!(N.getMacinfoType() == dwarf::DW_MACINFO_define || N
.getMacinfoType() == dwarf::DW_MACINFO_undef)) { DebugInfoCheckFailed
("invalid macinfo type", &N); return; } } while (0)
1047 N.getMacinfoType() == dwarf::DW_MACINFO_undef,do { if (!(N.getMacinfoType() == dwarf::DW_MACINFO_define || N
.getMacinfoType() == dwarf::DW_MACINFO_undef)) { DebugInfoCheckFailed
("invalid macinfo type", &N); return; } } while (0)
1048 "invalid macinfo type", &N)do { if (!(N.getMacinfoType() == dwarf::DW_MACINFO_define || N
.getMacinfoType() == dwarf::DW_MACINFO_undef)) { DebugInfoCheckFailed
("invalid macinfo type", &N); return; } } while (0)
;
1049 AssertDI(!N.getName().empty(), "anonymous macro", &N)do { if (!(!N.getName().empty())) { DebugInfoCheckFailed("anonymous macro"
, &N); return; } } while (0)
;
1050 if (!N.getValue().empty()) {
1051 assert(N.getValue().data()[0] != ' ' && "Macro value has a space prefix")((N.getValue().data()[0] != ' ' && "Macro value has a space prefix"
) ? static_cast<void> (0) : __assert_fail ("N.getValue().data()[0] != ' ' && \"Macro value has a space prefix\""
, "/tmp/buildd/llvm-toolchain-snapshot-3.9~svn271203/lib/IR/Verifier.cpp"
, 1051, __PRETTY_FUNCTION__))
;
1052 }
1053}
1054
1055void Verifier::visitDIMacroFile(const DIMacroFile &N) {
1056 AssertDI(N.getMacinfoType() == dwarf::DW_MACINFO_start_file,do { if (!(N.getMacinfoType() == dwarf::DW_MACINFO_start_file
)) { DebugInfoCheckFailed("invalid macinfo type", &N); return
; } } while (0)
1057 "invalid macinfo type", &N)do { if (!(N.getMacinfoType() == dwarf::DW_MACINFO_start_file
)) { DebugInfoCheckFailed("invalid macinfo type", &N); return
; } } while (0)
;
1058 if (auto *F = N.getRawFile())
1059 AssertDI(isa<DIFile>(F), "invalid file", &N, F)do { if (!(isa<DIFile>(F))) { DebugInfoCheckFailed("invalid file"
, &N, F); return; } } while (0)
;
1060
1061 if (auto *Array = N.getRawElements()) {
1062 AssertDI(isa<MDTuple>(Array), "invalid macro list", &N, Array)do { if (!(isa<MDTuple>(Array))) { DebugInfoCheckFailed
("invalid macro list", &N, Array); return; } } while (0)
;
1063 for (Metadata *Op : N.getElements()->operands()) {
1064 AssertDI(Op && isa<DIMacroNode>(Op), "invalid macro ref", &N, Op)do { if (!(Op && isa<DIMacroNode>(Op))) { DebugInfoCheckFailed
("invalid macro ref", &N, Op); return; } } while (0)
;
1065 }
1066 }
1067}
1068
1069void Verifier::visitDIModule(const DIModule &N) {
1070 AssertDI(N.getTag() == dwarf::DW_TAG_module, "invalid tag", &N)do { if (!(N.getTag() == dwarf::DW_TAG_module)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (0)
;
1071 AssertDI(!N.getName().empty(), "anonymous module", &N)do { if (!(!N.getName().empty())) { DebugInfoCheckFailed("anonymous module"
, &N); return; } } while (0)
;
1072}
1073
1074void Verifier::visitDITemplateParameter(const DITemplateParameter &N) {
1075 AssertDI(isType(N.getRawType()), "invalid type ref", &N, N.getRawType())do { if (!(isType(N.getRawType()))) { DebugInfoCheckFailed("invalid type ref"
, &N, N.getRawType()); return; } } while (0)
;
1076}
1077
1078void Verifier::visitDITemplateTypeParameter(const DITemplateTypeParameter &N) {
1079 visitDITemplateParameter(N);
1080
1081 AssertDI(N.getTag() == dwarf::DW_TAG_template_type_parameter, "invalid tag",do { if (!(N.getTag() == dwarf::DW_TAG_template_type_parameter
)) { DebugInfoCheckFailed("invalid tag", &N); return; } }
while (0)
1082 &N)do { if (!(N.getTag() == dwarf::DW_TAG_template_type_parameter
)) { DebugInfoCheckFailed("invalid tag", &N); return; } }
while (0)
;
1083}
1084
1085void Verifier::visitDITemplateValueParameter(
1086 const DITemplateValueParameter &N) {
1087 visitDITemplateParameter(N);
1088
1089 AssertDI(N.getTag() == dwarf::DW_TAG_template_value_parameter ||do { if (!(N.getTag() == dwarf::DW_TAG_template_value_parameter
|| N.getTag() == dwarf::DW_TAG_GNU_template_template_param ||
N.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (0)
1090 N.getTag() == dwarf::DW_TAG_GNU_template_template_param ||do { if (!(N.getTag() == dwarf::DW_TAG_template_value_parameter
|| N.getTag() == dwarf::DW_TAG_GNU_template_template_param ||
N.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (0)
1091 N.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack,do { if (!(N.getTag() == dwarf::DW_TAG_template_value_parameter
|| N.getTag() == dwarf::DW_TAG_GNU_template_template_param ||
N.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (0)
1092 "invalid tag", &N)do { if (!(N.getTag() == dwarf::DW_TAG_template_value_parameter
|| N.getTag() == dwarf::DW_TAG_GNU_template_template_param ||
N.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (0)
;
1093}
1094
1095void Verifier::visitDIVariable(const DIVariable &N) {
1096 if (auto *S = N.getRawScope())
1097 AssertDI(isa<DIScope>(S), "invalid scope", &N, S)do { if (!(isa<DIScope>(S))) { DebugInfoCheckFailed("invalid scope"
, &N, S); return; } } while (0)
;
1098 AssertDI(isType(N.getRawType()), "invalid type ref", &N, N.getRawType())do { if (!(isType(N.getRawType()))) { DebugInfoCheckFailed("invalid type ref"
, &N, N.getRawType()); return; } } while (0)
;
1099 if (auto *F = N.getRawFile())
1100 AssertDI(isa<DIFile>(F), "invalid file", &N, F)do { if (!(isa<DIFile>(F))) { DebugInfoCheckFailed("invalid file"
, &N, F); return; } } while (0)
;
1101}
1102
1103void Verifier::visitDIGlobalVariable(const DIGlobalVariable &N) {
1104 // Checks common to all variables.
1105 visitDIVariable(N);
1106
1107 AssertDI(N.getTag() == dwarf::DW_TAG_variable, "invalid tag", &N)do { if (!(N.getTag() == dwarf::DW_TAG_variable)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (0)
;
1108 AssertDI(!N.getName().empty(), "missing global variable name", &N)do { if (!(!N.getName().empty())) { DebugInfoCheckFailed("missing global variable name"
, &N); return; } } while (0)
;
1109 if (auto *V = N.getRawVariable()) {
1110 AssertDI(isa<ConstantAsMetadata>(V) &&do { if (!(isa<ConstantAsMetadata>(V) && !isa<
Function>(cast<ConstantAsMetadata>(V)->getValue()
))) { DebugInfoCheckFailed("invalid global varaible ref", &
N, V); return; } } while (0)
1111 !isa<Function>(cast<ConstantAsMetadata>(V)->getValue()),do { if (!(isa<ConstantAsMetadata>(V) && !isa<
Function>(cast<ConstantAsMetadata>(V)->getValue()
))) { DebugInfoCheckFailed("invalid global varaible ref", &
N, V); return; } } while (0)
1112 "invalid global varaible ref", &N, V)do { if (!(isa<ConstantAsMetadata>(V) && !isa<
Function>(cast<ConstantAsMetadata>(V)->getValue()
))) { DebugInfoCheckFailed("invalid global varaible ref", &
N, V); return; } } while (0)
;
1113 visitConstantExprsRecursively(cast<ConstantAsMetadata>(V)->getValue());
1114 }
1115 if (auto *Member = N.getRawStaticDataMemberDeclaration()) {
1116 AssertDI(isa<DIDerivedType>(Member),do { if (!(isa<DIDerivedType>(Member))) { DebugInfoCheckFailed
("invalid static data member declaration", &N, Member); return
; } } while (0)
1117 "invalid static data member declaration", &N, Member)do { if (!(isa<DIDerivedType>(Member))) { DebugInfoCheckFailed
("invalid static data member declaration", &N, Member); return
; } } while (0)
;
1118 }
1119}
1120
1121void Verifier::visitDILocalVariable(const DILocalVariable &N) {
1122 // Checks common to all variables.
1123 visitDIVariable(N);
1124
1125 AssertDI(N.getTag() == dwarf::DW_TAG_variable, "invalid tag", &N)do { if (!(N.getTag() == dwarf::DW_TAG_variable)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (0)
;
1126 AssertDI(N.getRawScope() && isa<DILocalScope>(N.getRawScope()),do { if (!(N.getRawScope() && isa<DILocalScope>
(N.getRawScope()))) { DebugInfoCheckFailed("local variable requires a valid scope"
, &N, N.getRawScope()); return; } } while (0)
1127 "local variable requires a valid scope", &N, N.getRawScope())do { if (!(N.getRawScope() && isa<DILocalScope>
(N.getRawScope()))) { DebugInfoCheckFailed("local variable requires a valid scope"
, &N, N.getRawScope()); return; } } while (0)
;
1128}
1129
1130void Verifier::visitDIExpression(const DIExpression &N) {
1131 AssertDI(N.isValid(), "invalid expression", &N)do { if (!(N.isValid())) { DebugInfoCheckFailed("invalid expression"
, &N); return; } } while (0)
;
1132}
1133
1134void Verifier::visitDIObjCProperty(const DIObjCProperty &N) {
1135 AssertDI(N.getTag() == dwarf::DW_TAG_APPLE_property, "invalid tag", &N)do { if (!(N.getTag() == dwarf::DW_TAG_APPLE_property)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (0)
;
1136 if (auto *T = N.getRawType())
1137 AssertDI(isType(T), "invalid type ref", &N, T)do { if (!(isType(T))) { DebugInfoCheckFailed("invalid type ref"
, &N, T); return; } } while (0)
;
1138 if (auto *F = N.getRawFile())
1139 AssertDI(isa<DIFile>(F), "invalid file", &N, F)do { if (!(isa<DIFile>(F))) { DebugInfoCheckFailed("invalid file"
, &N, F); return; } } while (0)
;
1140}
1141
1142void Verifier::visitDIImportedEntity(const DIImportedEntity &N) {
1143 AssertDI(N.getTag() == dwarf::DW_TAG_imported_module ||do { if (!(N.getTag() == dwarf::DW_TAG_imported_module || N.getTag
() == dwarf::DW_TAG_imported_declaration)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (0)
1144 N.getTag() == dwarf::DW_TAG_imported_declaration,do { if (!(N.getTag() == dwarf::DW_TAG_imported_module || N.getTag
() == dwarf::DW_TAG_imported_declaration)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (0)
1145 "invalid tag", &N)do { if (!(N.getTag() == dwarf::DW_TAG_imported_module || N.getTag
() == dwarf::DW_TAG_imported_declaration)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (0)
;
1146 if (auto *S = N.getRawScope())
1147 AssertDI(isa<DIScope>(S), "invalid scope for imported entity", &N, S)do { if (!(isa<DIScope>(S))) { DebugInfoCheckFailed("invalid scope for imported entity"
, &N, S); return; } } while (0)
;
1148 AssertDI(isDINode(N.getRawEntity()), "invalid imported entity", &N,do { if (!(isDINode(N.getRawEntity()))) { DebugInfoCheckFailed
("invalid imported entity", &N, N.getRawEntity()); return
; } } while (0)
1149 N.getRawEntity())do { if (!(isDINode(N.getRawEntity()))) { DebugInfoCheckFailed
("invalid imported entity", &N, N.getRawEntity()); return
; } } while (0)
;
1150}
1151
1152void Verifier::visitComdat(const Comdat &C) {
1153 // The Module is invalid if the GlobalValue has private linkage. Entities
1154 // with private linkage don't have entries in the symbol table.
1155 if (const GlobalValue *GV = M->getNamedValue(C.getName()))
1156 Assert(!GV->hasPrivateLinkage(), "comdat global value has private linkage",do { if (!(!GV->hasPrivateLinkage())) { CheckFailed("comdat global value has private linkage"
, GV); return; } } while (0)
1157 GV)do { if (!(!GV->hasPrivateLinkage())) { CheckFailed("comdat global value has private linkage"
, GV); return; } } while (0)
;
1158}
1159
1160void Verifier::visitModuleIdents(const Module &M) {
1161 const NamedMDNode *Idents = M.getNamedMetadata("llvm.ident");
1162 if (!Idents)
1163 return;
1164
1165 // llvm.ident takes a list of metadata entry. Each entry has only one string.
1166 // Scan each llvm.ident entry and make sure that this requirement is met.
1167 for (const MDNode *N : Idents->operands()) {
1168 Assert(N->getNumOperands() == 1,do { if (!(N->getNumOperands() == 1)) { CheckFailed("incorrect number of operands in llvm.ident metadata"
, N); return; } } while (0)
1169 "incorrect number of operands in llvm.ident metadata", N)do { if (!(N->getNumOperands() == 1)) { CheckFailed("incorrect number of operands in llvm.ident metadata"
, N); return; } } while (0)
;
1170 Assert(dyn_cast_or_null<MDString>(N->getOperand(0)),do { if (!(dyn_cast_or_null<MDString>(N->getOperand(
0)))) { CheckFailed(("invalid value for llvm.ident metadata entry operand"
"(the operand should be a string)"), N->getOperand(0)); return
; } } while (0)
1171 ("invalid value for llvm.ident metadata entry operand"do { if (!(dyn_cast_or_null<MDString>(N->getOperand(
0)))) { CheckFailed(("invalid value for llvm.ident metadata entry operand"
"(the operand should be a string)"), N->getOperand(0)); return
; } } while (0)
1172 "(the operand should be a string)"),do { if (!(dyn_cast_or_null<MDString>(N->getOperand(
0)))) { CheckFailed(("invalid value for llvm.ident metadata entry operand"
"(the operand should be a string)"), N->getOperand(0)); return
; } } while (0)
1173 N->getOperand(0))do { if (!(dyn_cast_or_null<MDString>(N->getOperand(
0)))) { CheckFailed(("invalid value for llvm.ident metadata entry operand"
"(the operand should be a string)"), N->getOperand(0)); return
; } } while (0)
;
1174 }
1175}
1176
1177void Verifier::visitModuleFlags(const Module &M) {
1178 const NamedMDNode *Flags = M.getModuleFlagsMetadata();
1179 if (!Flags) return;
1180
1181 // Scan each flag, and track the flags and requirements.
1182 DenseMap<const MDString*, const MDNode*> SeenIDs;
1183 SmallVector<const MDNode*, 16> Requirements;
1184 for (const MDNode *MDN : Flags->operands())
1185 visitModuleFlag(MDN, SeenIDs, Requirements);
1186
1187 // Validate that the requirements in the module are valid.
1188 for (const MDNode *Requirement : Requirements) {
1189 const MDString *Flag = cast<MDString>(Requirement->getOperand(0));
1190 const Metadata *ReqValue = Requirement->getOperand(1);
1191
1192 const MDNode *Op = SeenIDs.lookup(Flag);
1193 if (!Op) {
1194 CheckFailed("invalid requirement on flag, flag is not present in module",
1195 Flag);
1196 continue;
1197 }
1198
1199 if (Op->getOperand(2) != ReqValue) {
1200 CheckFailed(("invalid requirement on flag, "
1201 "flag does not have the required value"),
1202 Flag);
1203 continue;
1204 }
1205 }
1206}
1207
1208void
1209Verifier::visitModuleFlag(const MDNode *Op,
1210 DenseMap<const MDString *, const MDNode *> &SeenIDs,
1211 SmallVectorImpl<const MDNode *> &Requirements) {
1212 // Each module flag should have three arguments, the merge behavior (a
1213 // constant int), the flag ID (an MDString), and the value.
1214 Assert(Op->getNumOperands() == 3,do { if (!(Op->getNumOperands() == 3)) { CheckFailed("incorrect number of operands in module flag"
, Op); return; } } while (0)
1215 "incorrect number of operands in module flag", Op)do { if (!(Op->getNumOperands() == 3)) { CheckFailed("incorrect number of operands in module flag"
, Op); return; } } while (0)
;
1216 Module::ModFlagBehavior MFB;
1217 if (!Module::isValidModFlagBehavior(Op->getOperand(0), MFB)) {
1218 Assert(do { if (!(mdconst::dyn_extract_or_null<ConstantInt>(Op
->getOperand(0)))) { CheckFailed("invalid behavior operand in module flag (expected constant integer)"
, Op->getOperand(0)); return; } } while (0)
1219 mdconst::dyn_extract_or_null<ConstantInt>(Op->getOperand(0)),do { if (!(mdconst::dyn_extract_or_null<ConstantInt>(Op
->getOperand(0)))) { CheckFailed("invalid behavior operand in module flag (expected constant integer)"
, Op->getOperand(0)); return; } } while (0)
1220 "invalid behavior operand in module flag (expected constant integer)",do { if (!(mdconst::dyn_extract_or_null<ConstantInt>(Op
->getOperand(0)))) { CheckFailed("invalid behavior operand in module flag (expected constant integer)"
, Op->getOperand(0)); return; } } while (0)
1221 Op->getOperand(0))do { if (!(mdconst::dyn_extract_or_null<ConstantInt>(Op
->getOperand(0)))) { CheckFailed("invalid behavior operand in module flag (expected constant integer)"
, Op->getOperand(0)); return; } } while (0)
;
1222 Assert(false,do { if (!(false)) { CheckFailed("invalid behavior operand in module flag (unexpected constant)"
, Op->getOperand(0)); return; } } while (0)
1223 "invalid behavior operand in module flag (unexpected constant)",do { if (!(false)) { CheckFailed("invalid behavior operand in module flag (unexpected constant)"
, Op->getOperand(0)); return; } } while (0)
1224 Op->getOperand(0))do { if (!(false)) { CheckFailed("invalid behavior operand in module flag (unexpected constant)"
, Op->getOperand(0)); return; } } while (0)
;
1225 }
1226 MDString *ID = dyn_cast_or_null<MDString>(Op->getOperand(1));
1227 Assert(ID, "invalid ID operand in module flag (expected metadata string)",do { if (!(ID)) { CheckFailed("invalid ID operand in module flag (expected metadata string)"
, Op->getOperand(1)); return; } } while (0)
1228 Op->getOperand(1))do { if (!(ID)) { CheckFailed("invalid ID operand in module flag (expected metadata string)"
, Op->getOperand(1)); return; } } while (0)
;
1229
1230 // Sanity check the values for behaviors with additional requirements.
1231 switch (MFB) {
1232 case Module::Error:
1233 case Module::Warning:
1234 case Module::Override:
1235 // These behavior types accept any value.
1236 break;
1237
1238 case Module::Require: {
1239 // The value should itself be an MDNode with two operands, a flag ID (an
1240 // MDString), and a value.
1241 MDNode *Value = dyn_cast<MDNode>(Op->getOperand(2));
1242 Assert(Value && Value->getNumOperands() == 2,do { if (!(Value && Value->getNumOperands() == 2))
{ CheckFailed("invalid value for 'require' module flag (expected metadata pair)"
, Op->getOperand(2)); return; } } while (0)
1243 "invalid value for 'require' module flag (expected metadata pair)",do { if (!(Value && Value->getNumOperands() == 2))
{ CheckFailed("invalid value for 'require' module flag (expected metadata pair)"
, Op->getOperand(2)); return; } } while (0)
1244 Op->getOperand(2))do { if (!(Value && Value->getNumOperands() == 2))
{ CheckFailed("invalid value for 'require' module flag (expected metadata pair)"
, Op->getOperand(2)); return; } } while (0)
;
1245 Assert(isa<MDString>(Value->getOperand(0)),do { if (!(isa<MDString>(Value->getOperand(0)))) { CheckFailed
(("invalid value for 'require' module flag " "(first value operand should be a string)"
), Value->getOperand(0)); return; } } while (0)
1246 ("invalid value for 'require' module flag "do { if (!(isa<MDString>(Value->getOperand(0)))) { CheckFailed
(("invalid value for 'require' module flag " "(first value operand should be a string)"
), Value->getOperand(0)); return; } } while (0)
1247 "(first value operand should be a string)"),do { if (!(isa<MDString>(Value->getOperand(0)))) { CheckFailed
(("invalid value for 'require' module flag " "(first value operand should be a string)"
), Value->getOperand(0)); return; } } while (0)
1248 Value->getOperand(0))do { if (!(isa<MDString>(Value->getOperand(0)))) { CheckFailed
(("invalid value for 'require' module flag " "(first value operand should be a string)"
), Value->getOperand(0)); return; } } while (0)
;
1249
1250 // Append it to the list of requirements, to check once all module flags are
1251 // scanned.
1252 Requirements.push_back(Value);
1253 break;
1254 }
1255
1256 case Module::Append:
1257 case Module::AppendUnique: {
1258 // These behavior types require the operand be an MDNode.
1259 Assert(isa<MDNode>(Op->getOperand(2)),do { if (!(isa<MDNode>(Op->getOperand(2)))) { CheckFailed
("invalid value for 'append'-type module flag " "(expected a metadata node)"
, Op->getOperand(2)); return; } } while (0)
1260 "invalid value for 'append'-type module flag "do { if (!(isa<MDNode>(Op->getOperand(2)))) { CheckFailed
("invalid value for 'append'-type module flag " "(expected a metadata node)"
, Op->getOperand(2)); return; } } while (0)
1261 "(expected a metadata node)",do { if (!(isa<MDNode>(Op->getOperand(2)))) { CheckFailed
("invalid value for 'append'-type module flag " "(expected a metadata node)"
, Op->getOperand(2)); return; } } while (0)
1262 Op->getOperand(2))do { if (!(isa<MDNode>(Op->getOperand(2)))) { CheckFailed
("invalid value for 'append'-type module flag " "(expected a metadata node)"
, Op->getOperand(2)); return; } } while (0)
;
1263 break;
1264 }
1265 }
1266
1267 // Unless this is a "requires" flag, check the ID is unique.
1268 if (MFB != Module::Require) {
1269 bool Inserted = SeenIDs.insert(std::make_pair(ID, Op)).second;
1270 Assert(Inserted,do { if (!(Inserted)) { CheckFailed("module flag identifiers must be unique (or of 'require' type)"
, ID); return; } } while (0)
1271 "module flag identifiers must be unique (or of 'require' type)", ID)do { if (!(Inserted)) { CheckFailed("module flag identifiers must be unique (or of 'require' type)"
, ID); return; } } while (0)
;
1272 }
1273}
1274
1275void Verifier::verifyAttributeTypes(AttributeSet Attrs, unsigned Idx,
1276 bool isFunction, const Value *V) {
1277 unsigned Slot = ~0U;
1278 for (unsigned I = 0, E = Attrs.getNumSlots(); I != E; ++I)
1279 if (Attrs.getSlotIndex(I) == Idx) {
1280 Slot = I;
1281 break;
1282 }
1283
1284 assert(Slot != ~0U && "Attribute set inconsistency!")((Slot != ~0U && "Attribute set inconsistency!") ? static_cast
<void> (0) : __assert_fail ("Slot != ~0U && \"Attribute set inconsistency!\""
, "/tmp/buildd/llvm-toolchain-snapshot-3.9~svn271203/lib/IR/Verifier.cpp"
, 1284, __PRETTY_FUNCTION__))
;
1285
1286 for (AttributeSet::iterator I = Attrs.begin(Slot), E = Attrs.end(Slot);
1287 I != E; ++I) {
1288 if (I->isStringAttribute())
1289 continue;
1290
1291 if (I->getKindAsEnum() == Attribute::NoReturn ||
1292 I->getKindAsEnum() == Attribute::NoUnwind ||
1293 I->getKindAsEnum() == Attribute::NoInline ||
1294 I->getKindAsEnum() == Attribute::AlwaysInline ||
1295 I->getKindAsEnum() == Attribute::OptimizeForSize ||
1296 I->getKindAsEnum() == Attribute::StackProtect ||
1297 I->getKindAsEnum() == Attribute::StackProtectReq ||
1298 I->getKindAsEnum() == Attribute::StackProtectStrong ||
1299 I->getKindAsEnum() == Attribute::SafeStack ||
1300 I->getKindAsEnum() == Attribute::NoRedZone ||
1301 I->getKindAsEnum() == Attribute::NoImplicitFloat ||
1302 I->getKindAsEnum() == Attribute::Naked ||
1303 I->getKindAsEnum() == Attribute::InlineHint ||
1304 I->getKindAsEnum() == Attribute::StackAlignment ||
1305 I->getKindAsEnum() == Attribute::UWTable ||
1306 I->getKindAsEnum() == Attribute::NonLazyBind ||
1307 I->getKindAsEnum() == Attribute::ReturnsTwice ||
1308 I->getKindAsEnum() == Attribute::SanitizeAddress ||
1309 I->getKindAsEnum() == Attribute::SanitizeThread ||
1310 I->getKindAsEnum() == Attribute::SanitizeMemory ||
1311 I->getKindAsEnum() == Attribute::MinSize ||
1312 I->getKindAsEnum() == Attribute::NoDuplicate ||
1313 I->getKindAsEnum() == Attribute::Builtin ||
1314 I->getKindAsEnum() == Attribute::NoBuiltin ||
1315 I->getKindAsEnum() == Attribute::Cold ||
1316 I->getKindAsEnum() == Attribute::OptimizeNone ||
1317 I->getKindAsEnum() == Attribute::JumpTable ||
1318 I->getKindAsEnum() == Attribute::Convergent ||
1319 I->getKindAsEnum() == Attribute::ArgMemOnly ||
1320 I->getKindAsEnum() == Attribute::NoRecurse ||
1321 I->getKindAsEnum() == Attribute::InaccessibleMemOnly ||
1322 I->getKindAsEnum() == Attribute::InaccessibleMemOrArgMemOnly ||
1323 I->getKindAsEnum() == Attribute::AllocSize) {
1324 if (!isFunction) {
1325 CheckFailed("Attribute '" + I->getAsString() +
1326 "' only applies to functions!", V);
1327 return;
1328 }
1329 } else if (I->getKindAsEnum() == Attribute::ReadOnly ||
1330 I->getKindAsEnum() == Attribute::ReadNone) {
1331 if (Idx == 0) {
1332 CheckFailed("Attribute '" + I->getAsString() +
1333 "' does not apply to function returns");
1334 return;
1335 }
1336 } else if (isFunction) {
1337 CheckFailed("Attribute '" + I->getAsString() +
1338 "' does not apply to functions!", V);
1339 return;
1340 }
1341 }
1342}
1343
1344// VerifyParameterAttrs - Check the given attributes for an argument or return
1345// value of the specified type. The value V is printed in error messages.
1346void Verifier::verifyParameterAttrs(AttributeSet Attrs, unsigned Idx, Type *Ty,
1347 bool isReturnValue, const Value *V) {
1348 if (!Attrs.hasAttributes(Idx))
1349 return;
1350
1351 verifyAttributeTypes(Attrs, Idx, false, V);
1352
1353 if (isReturnValue)
1354 Assert(!Attrs.hasAttribute(Idx, Attribute::ByVal) &&do { if (!(!Attrs.hasAttribute(Idx, Attribute::ByVal) &&
!Attrs.hasAttribute(Idx, Attribute::Nest) && !Attrs.
hasAttribute(Idx, Attribute::StructRet) && !Attrs.hasAttribute
(Idx, Attribute::NoCapture) && !Attrs.hasAttribute(Idx
, Attribute::Returned) && !Attrs.hasAttribute(Idx, Attribute
::InAlloca) && !Attrs.hasAttribute(Idx, Attribute::SwiftSelf
) && !Attrs.hasAttribute(Idx, Attribute::SwiftError))
) { CheckFailed("Attributes 'byval', 'inalloca', 'nest', 'sret', 'nocapture', "
"'returned', 'swiftself', and 'swifterror' do not apply to return "
"values!", V); return; } } while (0)
1355 !Attrs.hasAttribute(Idx, Attribute::Nest) &&do { if (!(!Attrs.hasAttribute(Idx, Attribute::ByVal) &&
!Attrs.hasAttribute(Idx, Attribute::Nest) && !Attrs.
hasAttribute(Idx, Attribute::StructRet) && !Attrs.hasAttribute
(Idx, Attribute::NoCapture) && !Attrs.hasAttribute(Idx
, Attribute::Returned) && !Attrs.hasAttribute(Idx, Attribute
::InAlloca) && !Attrs.hasAttribute(Idx, Attribute::SwiftSelf
) && !Attrs.hasAttribute(Idx, Attribute::SwiftError))
) { CheckFailed("Attributes 'byval', 'inalloca', 'nest', 'sret', 'nocapture', "
"'returned', 'swiftself', and 'swifterror' do not apply to return "
"values!", V); return; } } while (0)
1356 !Attrs.hasAttribute(Idx, Attribute::StructRet) &&do { if (!(!Attrs.hasAttribute(Idx, Attribute::ByVal) &&
!Attrs.hasAttribute(Idx, Attribute::Nest) && !Attrs.
hasAttribute(Idx, Attribute::StructRet) && !Attrs.hasAttribute
(Idx, Attribute::NoCapture) && !Attrs.hasAttribute(Idx
, Attribute::Returned) && !Attrs.hasAttribute(Idx, Attribute
::InAlloca) && !Attrs.hasAttribute(Idx, Attribute::SwiftSelf
) && !Attrs.hasAttribute(Idx, Attribute::SwiftError))
) { CheckFailed("Attributes 'byval', 'inalloca', 'nest', 'sret', 'nocapture', "
"'returned', 'swiftself', and 'swifterror' do not apply to return "
"values!", V); return; } } while (0)
1357 !Attrs.hasAttribute(Idx, Attribute::NoCapture) &&do { if (!(!Attrs.hasAttribute(Idx, Attribute::ByVal) &&
!Attrs.hasAttribute(Idx, Attribute::Nest) && !Attrs.
hasAttribute(Idx, Attribute::StructRet) && !Attrs.hasAttribute
(Idx, Attribute::NoCapture) && !Attrs.hasAttribute(Idx
, Attribute::Returned) && !Attrs.hasAttribute(Idx, Attribute
::InAlloca) && !Attrs.hasAttribute(Idx, Attribute::SwiftSelf
) && !Attrs.hasAttribute(Idx, Attribute::SwiftError))
) { CheckFailed("Attributes 'byval', 'inalloca', 'nest', 'sret', 'nocapture', "
"'returned', 'swiftself', and 'swifterror' do not apply to return "
"values!", V); return; } } while (0)
1358 !Attrs.hasAttribute(Idx, Attribute::Returned) &&do { if (!(!Attrs.hasAttribute(Idx, Attribute::ByVal) &&
!Attrs.hasAttribute(Idx, Attribute::Nest) && !Attrs.
hasAttribute(Idx, Attribute::StructRet) && !Attrs.hasAttribute
(Idx, Attribute::NoCapture) && !Attrs.hasAttribute(Idx
, Attribute::Returned) && !Attrs.hasAttribute(Idx, Attribute
::InAlloca) && !Attrs.hasAttribute(Idx, Attribute::SwiftSelf
) && !Attrs.hasAttribute(Idx, Attribute::SwiftError))
) { CheckFailed("Attributes 'byval', 'inalloca', 'nest', 'sret', 'nocapture', "
"'returned', 'swiftself', and 'swifterror' do not apply to return "
"values!", V); return; } } while (0)
1359 !Attrs.hasAttribute(Idx, Attribute::InAlloca) &&do { if (!(!Attrs.hasAttribute(Idx, Attribute::ByVal) &&
!Attrs.hasAttribute(Idx, Attribute::Nest) && !Attrs.
hasAttribute(Idx, Attribute::StructRet) && !Attrs.hasAttribute
(Idx, Attribute::NoCapture) && !Attrs.hasAttribute(Idx
, Attribute::Returned) && !Attrs.hasAttribute(Idx, Attribute
::InAlloca) && !Attrs.hasAttribute(Idx, Attribute::SwiftSelf
) && !Attrs.hasAttribute(Idx, Attribute::SwiftError))
) { CheckFailed("Attributes 'byval', 'inalloca', 'nest', 'sret', 'nocapture', "
"'returned', 'swiftself', and 'swifterror' do not apply to return "
"values!", V); return; } } while (0)
1360 !Attrs.hasAttribute(Idx, Attribute::SwiftSelf) &&do { if (!(!Attrs.hasAttribute(Idx, Attribute::ByVal) &&
!Attrs.hasAttribute(Idx, Attribute::Nest) && !Attrs.
hasAttribute(Idx, Attribute::StructRet) && !Attrs.hasAttribute
(Idx, Attribute::NoCapture) && !Attrs.hasAttribute(Idx
, Attribute::Returned) && !Attrs.hasAttribute(Idx, Attribute
::InAlloca) && !Attrs.hasAttribute(Idx, Attribute::SwiftSelf
) && !Attrs.hasAttribute(Idx, Attribute::SwiftError))
) { CheckFailed("Attributes 'byval', 'inalloca', 'nest', 'sret', 'nocapture', "
"'returned', 'swiftself', and 'swifterror' do not apply to return "
"values!", V); return; } } while (0)
1361 !Attrs.hasAttribute(Idx, Attribute::SwiftError),do { if (!(!Attrs.hasAttribute(Idx, Attribute::ByVal) &&
!Attrs.hasAttribute(Idx, Attribute::Nest) && !Attrs.
hasAttribute(Idx, Attribute::StructRet) && !Attrs.hasAttribute
(Idx, Attribute::NoCapture) && !Attrs.hasAttribute(Idx
, Attribute::Returned) && !Attrs.hasAttribute(Idx, Attribute
::InAlloca) && !Attrs.hasAttribute(Idx, Attribute::SwiftSelf
) && !Attrs.hasAttribute(Idx, Attribute::SwiftError))
) { CheckFailed("Attributes 'byval', 'inalloca', 'nest', 'sret', 'nocapture', "
"'returned', 'swiftself', and 'swifterror' do not apply to return "
"values!", V); return; } } while (0)
1362 "Attributes 'byval', 'inalloca', 'nest', 'sret', 'nocapture', "do { if (!(!Attrs.hasAttribute(Idx, Attribute::ByVal) &&
!Attrs.hasAttribute(Idx, Attribute::Nest) && !Attrs.
hasAttribute(Idx, Attribute::StructRet) && !Attrs.hasAttribute
(Idx, Attribute::NoCapture) && !Attrs.hasAttribute(Idx
, Attribute::Returned) && !Attrs.hasAttribute(Idx, Attribute
::InAlloca) && !Attrs.hasAttribute(Idx, Attribute::SwiftSelf
) && !Attrs.hasAttribute(Idx, Attribute::SwiftError))
) { CheckFailed("Attributes 'byval', 'inalloca', 'nest', 'sret', 'nocapture', "
"'returned', 'swiftself', and 'swifterror' do not apply to return "
"values!", V); return; } } while (0)
1363 "'returned', 'swiftself', and 'swifterror' do not apply to return "do { if (!(!Attrs.hasAttribute(Idx, Attribute::ByVal) &&
!Attrs.hasAttribute(Idx, Attribute::Nest) && !Attrs.
hasAttribute(Idx, Attribute::StructRet) && !Attrs.hasAttribute
(Idx, Attribute::NoCapture) && !Attrs.hasAttribute(Idx
, Attribute::Returned) && !Attrs.hasAttribute(Idx, Attribute
::InAlloca) && !Attrs.hasAttribute(Idx, Attribute::SwiftSelf
) && !Attrs.hasAttribute(Idx, Attribute::SwiftError))
) { CheckFailed("Attributes 'byval', 'inalloca', 'nest', 'sret', 'nocapture', "
"'returned', 'swiftself', and 'swifterror' do not apply to return "
"values!", V); return; } } while (0)
1364 "values!",do { if (!(!Attrs.hasAttribute(Idx, Attribute::ByVal) &&
!Attrs.hasAttribute(Idx, Attribute::Nest) && !Attrs.
hasAttribute(Idx, Attribute::StructRet) && !Attrs.hasAttribute
(Idx, Attribute::NoCapture) && !Attrs.hasAttribute(Idx
, Attribute::Returned) && !Attrs.hasAttribute(Idx, Attribute
::InAlloca) && !Attrs.hasAttribute(Idx, Attribute::SwiftSelf
) && !Attrs.hasAttribute(Idx, Attribute::SwiftError))
) { CheckFailed("Attributes 'byval', 'inalloca', 'nest', 'sret', 'nocapture', "
"'returned', 'swiftself', and 'swifterror' do not apply to return "
"values!", V); return; } } while (0)
1365 V)do { if (!(!Attrs.hasAttribute(Idx, Attribute::ByVal) &&
!Attrs.hasAttribute(Idx, Attribute::Nest) && !Attrs.
hasAttribute(Idx, Attribute::StructRet) && !Attrs.hasAttribute
(Idx, Attribute::NoCapture) && !Attrs.hasAttribute(Idx
, Attribute::Returned) && !Attrs.hasAttribute(Idx, Attribute
::InAlloca) && !Attrs.hasAttribute(Idx, Attribute::SwiftSelf
) && !Attrs.hasAttribute(Idx, Attribute::SwiftError))
) { CheckFailed("Attributes 'byval', 'inalloca', 'nest', 'sret', 'nocapture', "
"'returned', 'swiftself', and 'swifterror' do not apply to return "
"values!", V); return; } } while (0)
;
1366
1367 // Check for mutually incompatible attributes. Only inreg is compatible with
1368 // sret.
1369 unsigned AttrCount = 0;
1370 AttrCount += Attrs.hasAttribute(Idx, Attribute::ByVal);
1371 AttrCount += Attrs.hasAttribute(Idx, Attribute::InAlloca);
1372 AttrCount += Attrs.hasAttribute(Idx, Attribute::StructRet) ||
1373 Attrs.hasAttribute(Idx, Attribute::InReg);
1374 AttrCount += Attrs.hasAttribute(Idx, Attribute::Nest);
1375 Assert(AttrCount <= 1, "Attributes 'byval', 'inalloca', 'inreg', 'nest', "do { if (!(AttrCount <= 1)) { CheckFailed("Attributes 'byval', 'inalloca', 'inreg', 'nest', "
"and 'sret' are incompatible!", V); return; } } while (0)
1376 "and 'sret' are incompatible!",do { if (!(AttrCount <= 1)) { CheckFailed("Attributes 'byval', 'inalloca', 'inreg', 'nest', "
"and 'sret' are incompatible!", V); return; } } while (0)
1377 V)do { if (!(AttrCount <= 1)) { CheckFailed("Attributes 'byval', 'inalloca', 'inreg', 'nest', "
"and 'sret' are incompatible!", V); return; } } while (0)
;
1378
1379 Assert(!(Attrs.hasAttribute(Idx, Attribute::InAlloca) &&do { if (!(!(Attrs.hasAttribute(Idx, Attribute::InAlloca) &&
Attrs.hasAttribute(Idx, Attribute::ReadOnly)))) { CheckFailed
("Attributes " "'inalloca and readonly' are incompatible!", V
); return; } } while (0)
1380 Attrs.hasAttribute(Idx, Attribute::ReadOnly)),do { if (!(!(Attrs.hasAttribute(Idx, Attribute::InAlloca) &&
Attrs.hasAttribute(Idx, Attribute::ReadOnly)))) { CheckFailed
("Attributes " "'inalloca and readonly' are incompatible!", V
); return; } } while (0)
1381 "Attributes "do { if (!(!(Attrs.hasAttribute(Idx, Attribute::InAlloca) &&
Attrs.hasAttribute(Idx, Attribute::ReadOnly)))) { CheckFailed
("Attributes " "'inalloca and readonly' are incompatible!", V
); return; } } while (0)
1382 "'inalloca and readonly' are incompatible!",do { if (!(!(Attrs.hasAttribute(Idx, Attribute::InAlloca) &&
Attrs.hasAttribute(Idx, Attribute::ReadOnly)))) { CheckFailed
("Attributes " "'inalloca and readonly' are incompatible!", V
); return; } } while (0)
1383 V)do { if (!(!(Attrs.hasAttribute(Idx, Attribute::InAlloca) &&
Attrs.hasAttribute(Idx, Attribute::ReadOnly)))) { CheckFailed
("Attributes " "'inalloca and readonly' are incompatible!", V
); return; } } while (0)
;
1384
1385 Assert(!(Attrs.hasAttribute(Idx, Attribute::StructRet) &&do { if (!(!(Attrs.hasAttribute(Idx, Attribute::StructRet) &&
Attrs.hasAttribute(Idx, Attribute::Returned)))) { CheckFailed
("Attributes " "'sret and returned' are incompatible!", V); return
; } } while (0)
1386 Attrs.hasAttribute(Idx, Attribute::Returned)),do { if (!(!(Attrs.hasAttribute(Idx, Attribute::StructRet) &&
Attrs.hasAttribute(Idx, Attribute::Returned)))) { CheckFailed
("Attributes " "'sret and returned' are incompatible!", V); return
; } } while (0)
1387 "Attributes "do { if (!(!(Attrs.hasAttribute(Idx, Attribute::StructRet) &&
Attrs.hasAttribute(Idx, Attribute::Returned)))) { CheckFailed
("Attributes " "'sret and returned' are incompatible!", V); return
; } } while (0)
1388 "'sret and returned' are incompatible!",do { if (!(!(Attrs.hasAttribute(Idx, Attribute::StructRet) &&
Attrs.hasAttribute(Idx, Attribute::Returned)))) { CheckFailed
("Attributes " "'sret and returned' are incompatible!", V); return
; } } while (0)
1389 V)do { if (!(!(Attrs.hasAttribute(Idx, Attribute::StructRet) &&
Attrs.hasAttribute(Idx, Attribute::Returned)))) { CheckFailed
("Attributes " "'sret and returned' are incompatible!", V); return
; } } while (0)
;
1390
1391 Assert(!(Attrs.hasAttribute(Idx, Attribute::ZExt) &&do { if (!(!(Attrs.hasAttribute(Idx, Attribute::ZExt) &&
Attrs.hasAttribute(Idx, Attribute::SExt)))) { CheckFailed("Attributes "
"'zeroext and signext' are incompatible!", V); return; } } while
(0)
1392 Attrs.hasAttribute(Idx, Attribute::SExt)),do { if (!(!(Attrs.hasAttribute(Idx, Attribute::ZExt) &&
Attrs.hasAttribute(Idx, Attribute::SExt)))) { CheckFailed("Attributes "
"'zeroext and signext' are incompatible!", V); return; } } while
(0)
1393 "Attributes "do { if (!(!(Attrs.hasAttribute(Idx, Attribute::ZExt) &&
Attrs.hasAttribute(Idx, Attribute::SExt)))) { CheckFailed("Attributes "
"'zeroext and signext' are incompatible!", V); return; } } while
(0)
1394 "'zeroext and signext' are incompatible!",do { if (!(!(Attrs.hasAttribute(Idx, Attribute::ZExt) &&
Attrs.hasAttribute(Idx, Attribute::SExt)))) { CheckFailed("Attributes "
"'zeroext and signext' are incompatible!", V); return; } } while
(0)
1395 V)do { if (!(!(Attrs.hasAttribute(Idx, Attribute::ZExt) &&
Attrs.hasAttribute(Idx, Attribute::SExt)))) { CheckFailed("Attributes "
"'zeroext and signext' are incompatible!", V); return; } } while
(0)
;
1396
1397 Assert(!(Attrs.hasAttribute(Idx, Attribute::ReadNone) &&do { if (!(!(Attrs.hasAttribute(Idx, Attribute::ReadNone) &&
Attrs.hasAttribute(Idx, Attribute::ReadOnly)))) { CheckFailed
("Attributes " "'readnone and readonly' are incompatible!", V
); return; } } while (0)
1398 Attrs.hasAttribute(Idx, Attribute::ReadOnly)),do { if (!(!(Attrs.hasAttribute(Idx, Attribute::ReadNone) &&
Attrs.hasAttribute(Idx, Attribute::ReadOnly)))) { CheckFailed
("Attributes " "'readnone and readonly' are incompatible!", V
); return; } } while (0)
1399 "Attributes "do { if (!(!(Attrs.hasAttribute(Idx, Attribute::ReadNone) &&
Attrs.hasAttribute(Idx, Attribute::ReadOnly)))) { CheckFailed
("Attributes " "'readnone and readonly' are incompatible!", V
); return; } } while (0)
1400 "'readnone and readonly' are incompatible!",do { if (!(!(Attrs.hasAttribute(Idx, Attribute::ReadNone) &&
Attrs.hasAttribute(Idx, Attribute::ReadOnly)))) { CheckFailed
("Attributes " "'readnone and readonly' are incompatible!", V
); return; } } while (0)
1401 V)do { if (!(!(Attrs.hasAttribute(Idx, Attribute::ReadNone) &&
Attrs.hasAttribute(Idx, Attribute::ReadOnly)))) { CheckFailed
("Attributes " "'readnone and readonly' are incompatible!", V
); return; } } while (0)
;
1402
1403 Assert(!(Attrs.hasAttribute(Idx, Attribute::NoInline) &&do { if (!(!(Attrs.hasAttribute(Idx, Attribute::NoInline) &&
Attrs.hasAttribute(Idx, Attribute::AlwaysInline)))) { CheckFailed
("Attributes " "'noinline and alwaysinline' are incompatible!"
, V); return; } } while (0)
1404 Attrs.hasAttribute(Idx, Attribute::AlwaysInline)),do { if (!(!(Attrs.hasAttribute(Idx, Attribute::NoInline) &&
Attrs.hasAttribute(Idx, Attribute::AlwaysInline)))) { CheckFailed
("Attributes " "'noinline and alwaysinline' are incompatible!"
, V); return; } } while (0)
1405 "Attributes "do { if (!(!(Attrs.hasAttribute(Idx, Attribute::NoInline) &&
Attrs.hasAttribute(Idx, Attribute::AlwaysInline)))) { CheckFailed
("Attributes " "'noinline and alwaysinline' are incompatible!"
, V); return; } } while (0)
1406 "'noinline and alwaysinline' are incompatible!",do { if (!(!(Attrs.hasAttribute(Idx, Attribute::NoInline) &&
Attrs.hasAttribute(Idx, Attribute::AlwaysInline)))) { CheckFailed
("Attributes " "'noinline and alwaysinline' are incompatible!"
, V); return; } } while (0)
1407 V)do { if (!(!(Attrs.hasAttribute(Idx, Attribute::NoInline) &&
Attrs.hasAttribute(Idx, Attribute::AlwaysInline)))) { CheckFailed
("Attributes " "'noinline and alwaysinline' are incompatible!"
, V); return; } } while (0)
;
1408
1409 Assert(!AttrBuilder(Attrs, Idx)do { if (!(!AttrBuilder(Attrs, Idx) .overlaps(AttributeFuncs::
typeIncompatible(Ty)))) { CheckFailed("Wrong types for attribute: "
+ AttributeSet::get(*Context, Idx, AttributeFuncs::typeIncompatible
(Ty)).getAsString(Idx), V); return; } } while (0)
1410 .overlaps(AttributeFuncs::typeIncompatible(Ty)),do { if (!(!AttrBuilder(Attrs, Idx) .overlaps(AttributeFuncs::
typeIncompatible(Ty)))) { CheckFailed("Wrong types for attribute: "
+ AttributeSet::get(*Context, Idx, AttributeFuncs::typeIncompatible
(Ty)).getAsString(Idx), V); return; } } while (0)
1411 "Wrong types for attribute: " +do { if (!(!AttrBuilder(Attrs, Idx) .overlaps(AttributeFuncs::
typeIncompatible(Ty)))) { CheckFailed("Wrong types for attribute: "
+ AttributeSet::get(*Context, Idx, AttributeFuncs::typeIncompatible
(Ty)).getAsString(Idx), V); return; } } while (0)
1412 AttributeSet::get(*Context, Idx,do { if (!(!AttrBuilder(Attrs, Idx) .overlaps(AttributeFuncs::
typeIncompatible(Ty)))) { CheckFailed("Wrong types for attribute: "
+ AttributeSet::get(*Context, Idx, AttributeFuncs::typeIncompatible
(Ty)).getAsString(Idx), V); return; } } while (0)
1413 AttributeFuncs::typeIncompatible(Ty)).getAsString(Idx),do { if (!(!AttrBuilder(Attrs, Idx) .overlaps(AttributeFuncs::
typeIncompatible(Ty)))) { CheckFailed("Wrong types for attribute: "
+ AttributeSet::get(*Context, Idx, AttributeFuncs::typeIncompatible
(Ty)).getAsString(Idx), V); return; } } while (0)
1414 V)do { if (!(!AttrBuilder(Attrs, Idx) .overlaps(AttributeFuncs::
typeIncompatible(Ty)))) { CheckFailed("Wrong types for attribute: "
+ AttributeSet::get(*Context, Idx, AttributeFuncs::typeIncompatible
(Ty)).getAsString(Idx), V); return; } } while (0)
;
1415
1416 if (PointerType *PTy = dyn_cast<PointerType>(Ty)) {
1417 SmallPtrSet<Type*, 4> Visited;
1418 if (!PTy->getElementType()->isSized(&Visited)) {
1419 Assert(!Attrs.hasAttribute(Idx, Attribute::ByVal) &&do { if (!(!Attrs.hasAttribute(Idx, Attribute::ByVal) &&
!Attrs.hasAttribute(Idx, Attribute::InAlloca))) { CheckFailed
("Attributes 'byval' and 'inalloca' do not support unsized types!"
, V); return; } } while (0)
1420 !Attrs.hasAttribute(Idx, Attribute::InAlloca),do { if (!(!Attrs.hasAttribute(Idx, Attribute::ByVal) &&
!Attrs.hasAttribute(Idx, Attribute::InAlloca))) { CheckFailed
("Attributes 'byval' and 'inalloca' do not support unsized types!"
, V); return; } } while (0)
1421 "Attributes 'byval' and 'inalloca' do not support unsized types!",do { if (!(!Attrs.hasAttribute(Idx, Attribute::ByVal) &&
!Attrs.hasAttribute(Idx, Attribute::InAlloca))) { CheckFailed
("Attributes 'byval' and 'inalloca' do not support unsized types!"
, V); return; } } while (0)
1422 V)do { if (!(!Attrs.hasAttribute(Idx, Attribute::ByVal) &&
!Attrs.hasAttribute(Idx, Attribute::InAlloca))) { CheckFailed
("Attributes 'byval' and 'inalloca' do not support unsized types!"
, V); return; } } while (0)
;
1423 }
1424 if (!isa<PointerType>(PTy->getElementType()))
1425 Assert(!Attrs.hasAttribute(Idx, Attribute::SwiftError),do { if (!(!Attrs.hasAttribute(Idx, Attribute::SwiftError))) {
CheckFailed("Attribute 'swifterror' only applies to parameters "
"with pointer to pointer type!", V); return; } } while (0)
1426 "Attribute 'swifterror' only applies to parameters "do { if (!(!Attrs.hasAttribute(Idx, Attribute::SwiftError))) {
CheckFailed("Attribute 'swifterror' only applies to parameters "
"with pointer to pointer type!", V); return; } } while (0)
1427 "with pointer to pointer type!",do { if (!(!Attrs.hasAttribute(Idx, Attribute::SwiftError))) {
CheckFailed("Attribute 'swifterror' only applies to parameters "
"with pointer to pointer type!", V); return; } } while (0)
1428 V)do { if (!(!Attrs.hasAttribute(Idx, Attribute::SwiftError))) {
CheckFailed("Attribute 'swifterror' only applies to parameters "
"with pointer to pointer type!", V); return; } } while (0)
;
1429 } else {
1430 Assert(!Attrs.hasAttribute(Idx, Attribute::ByVal),do { if (!(!Attrs.hasAttribute(Idx, Attribute::ByVal))) { CheckFailed
("Attribute 'byval' only applies to parameters with pointer type!"
, V); return; } } while (0)
1431 "Attribute 'byval' only applies to parameters with pointer type!",do { if (!(!Attrs.hasAttribute(Idx, Attribute::ByVal))) { CheckFailed
("Attribute 'byval' only applies to parameters with pointer type!"
, V); return; } } while (0)
1432 V)do { if (!(!Attrs.hasAttribute(Idx, Attribute::ByVal))) { CheckFailed
("Attribute 'byval' only applies to parameters with pointer type!"
, V); return; } } while (0)
;
1433 Assert(!Attrs.hasAttribute(Idx, Attribute::SwiftError),do { if (!(!Attrs.hasAttribute(Idx, Attribute::SwiftError))) {
CheckFailed("Attribute 'swifterror' only applies to parameters "
"with pointer type!", V); return; } } while (0)
1434 "Attribute 'swifterror' only applies to parameters "do { if (!(!Attrs.hasAttribute(Idx, Attribute::SwiftError))) {
CheckFailed("Attribute 'swifterror' only applies to parameters "
"with pointer type!", V); return; } } while (0)
1435 "with pointer type!",do { if (!(!Attrs.hasAttribute(Idx, Attribute::SwiftError))) {
CheckFailed("Attribute 'swifterror' only applies to parameters "
"with pointer type!", V); return; } } while (0)
1436 V)do { if (!(!Attrs.hasAttribute(Idx, Attribute::SwiftError))) {
CheckFailed("Attribute 'swifterror' only applies to parameters "
"with pointer type!", V); return; } } while (0)
;
1437 }
1438}
1439
1440// Check parameter attributes against a function type.
1441// The value V is printed in error messages.
1442void Verifier::verifyFunctionAttrs(FunctionType *FT, AttributeSet Attrs,
1443 const Value *V) {
1444 if (Attrs.isEmpty())
1445 return;
1446
1447 bool SawNest = false;
1448 bool SawReturned = false;
1449 bool SawSRet = false;
1450 bool SawSwiftSelf = false;
1451 bool SawSwiftError = false;
1452
1453 for (unsigned i = 0, e = Attrs.getNumSlots(); i != e; ++i) {
1454 unsigned Idx = Attrs.getSlotIndex(i);
1455
1456 Type *Ty;
1457 if (Idx == 0)
1458 Ty = FT->getReturnType();
1459 else if (Idx-1 < FT->getNumParams())
1460 Ty = FT->getParamType(Idx-1);
1461 else
1462 break; // VarArgs attributes, verified elsewhere.
1463
1464 verifyParameterAttrs(Attrs, Idx, Ty, Idx == 0, V);
1465
1466 if (Idx == 0)
1467 continue;
1468
1469 if (Attrs.hasAttribute(Idx, Attribute::Nest)) {
1470 Assert(!SawNest, "More than one parameter has attribute nest!", V)do { if (!(!SawNest)) { CheckFailed("More than one parameter has attribute nest!"
, V); return; } } while (0)
;
1471 SawNest = true;
1472 }
1473
1474 if (Attrs.hasAttribute(Idx, Attribute::Returned)) {
1475 Assert(!SawReturned, "More than one parameter has attribute returned!",do { if (!(!SawReturned)) { CheckFailed("More than one parameter has attribute returned!"
, V); return; } } while (0)
1476 V)do { if (!(!SawReturned)) { CheckFailed("More than one parameter has attribute returned!"
, V); return; } } while (0)
;
1477 Assert(Ty->canLosslesslyBitCastTo(FT->getReturnType()),do { if (!(Ty->canLosslesslyBitCastTo(FT->getReturnType
()))) { CheckFailed("Incompatible " "argument and return types for 'returned' attribute"
, V); return; } } while (0)
1478 "Incompatible "do { if (!(Ty->canLosslesslyBitCastTo(FT->getReturnType
()))) { CheckFailed("Incompatible " "argument and return types for 'returned' attribute"
, V); return; } } while (0)
1479 "argument and return types for 'returned' attribute",do { if (!(Ty->canLosslesslyBitCastTo(FT->getReturnType
()))) { CheckFailed("Incompatible " "argument and return types for 'returned' attribute"
, V); return; } } while (0)
1480 V)do { if (!(Ty->canLosslesslyBitCastTo(FT->getReturnType
()))) { CheckFailed("Incompatible " "argument and return types for 'returned' attribute"
, V); return; } } while (0)
;
1481 SawReturned = true;
1482 }
1483
1484 if (Attrs.hasAttribute(Idx, Attribute::StructRet)) {
1485 Assert(!SawSRet, "Cannot have multiple 'sret' parameters!", V)do { if (!(!SawSRet)) { CheckFailed("Cannot have multiple 'sret' parameters!"
, V); return; } } while (0)
;
1486 Assert(Idx == 1 || Idx == 2,do { if (!(Idx == 1 || Idx == 2)) { CheckFailed("Attribute 'sret' is not on first or second parameter!"
, V); return; } } while (0)
1487 "Attribute 'sret' is not on first or second parameter!", V)do { if (!(Idx == 1 || Idx == 2)) { CheckFailed("Attribute 'sret' is not on first or second parameter!"
, V); return; } } while (0)
;
1488 SawSRet = true;
1489 }
1490
1491 if (Attrs.hasAttribute(Idx, Attribute::SwiftSelf)) {
1492 Assert(!SawSwiftSelf, "Cannot have multiple 'swiftself' parameters!", V)do { if (!(!SawSwiftSelf)) { CheckFailed("Cannot have multiple 'swiftself' parameters!"
, V); return; } } while (0)
;
1493 SawSwiftSelf = true;
1494 }
1495
1496 if (Attrs.hasAttribute(Idx, Attribute::SwiftError)) {
1497 Assert(!SawSwiftError, "Cannot have multiple 'swifterror' parameters!",do { if (!(!SawSwiftError)) { CheckFailed("Cannot have multiple 'swifterror' parameters!"
, V); return; } } while (0)
1498 V)do { if (!(!SawSwiftError)) { CheckFailed("Cannot have multiple 'swifterror' parameters!"
, V); return; } } while (0)
;
1499 SawSwiftError = true;
1500 }
1501
1502 if (Attrs.hasAttribute(Idx, Attribute::InAlloca)) {
1503 Assert(Idx == FT->getNumParams(), "inalloca isn't on the last parameter!",do { if (!(Idx == FT->getNumParams())) { CheckFailed("inalloca isn't on the last parameter!"
, V); return; } } while (0)
1504 V)do { if (!(Idx == FT->getNumParams())) { CheckFailed("inalloca isn't on the last parameter!"
, V); return; } } while (0)
;
1505 }
1506 }
1507
1508 if (!Attrs.hasAttributes(AttributeSet::FunctionIndex))
1509 return;
1510
1511 verifyAttributeTypes(Attrs, AttributeSet::FunctionIndex, true, V);
1512
1513 Assert(do { if (!(!(Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute
::ReadNone) && Attrs.hasAttribute(AttributeSet::FunctionIndex
, Attribute::ReadOnly)))) { CheckFailed("Attributes 'readnone and readonly' are incompatible!"
, V); return; } } while (0)
1514 !(Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute::ReadNone) &&do { if (!(!(Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute
::ReadNone) && Attrs.hasAttribute(AttributeSet::FunctionIndex
, Attribute::ReadOnly)))) { CheckFailed("Attributes 'readnone and readonly' are incompatible!"
, V); return; } } while (0)
1515 Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute::ReadOnly)),do { if (!(!(Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute
::ReadNone) && Attrs.hasAttribute(AttributeSet::FunctionIndex
, Attribute::ReadOnly)))) { CheckFailed("Attributes 'readnone and readonly' are incompatible!"
, V); return; } } while (0)
1516 "Attributes 'readnone and readonly' are incompatible!", V)do { if (!(!(Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute
::ReadNone) && Attrs.hasAttribute(AttributeSet::FunctionIndex
, Attribute::ReadOnly)))) { CheckFailed("Attributes 'readnone and readonly' are incompatible!"
, V); return; } } while (0)
;
1517
1518 Assert(do { if (!(!(Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute
::ReadNone) && Attrs.hasAttribute(AttributeSet::FunctionIndex
, Attribute::InaccessibleMemOrArgMemOnly)))) { CheckFailed("Attributes 'readnone and inaccessiblemem_or_argmemonly' are incompatible!"
, V); return; } } while (0)
1519 !(Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute::ReadNone) &&do { if (!(!(Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute
::ReadNone) && Attrs.hasAttribute(AttributeSet::FunctionIndex
, Attribute::InaccessibleMemOrArgMemOnly)))) { CheckFailed("Attributes 'readnone and inaccessiblemem_or_argmemonly' are incompatible!"
, V); return; } } while (0)
1520 Attrs.hasAttribute(AttributeSet::FunctionIndex,do { if (!(!(Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute
::ReadNone) && Attrs.hasAttribute(AttributeSet::FunctionIndex
, Attribute::InaccessibleMemOrArgMemOnly)))) { CheckFailed("Attributes 'readnone and inaccessiblemem_or_argmemonly' are incompatible!"
, V); return; } } while (0)
1521 Attribute::InaccessibleMemOrArgMemOnly)),do { if (!(!(Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute
::ReadNone) && Attrs.hasAttribute(AttributeSet::FunctionIndex
, Attribute::InaccessibleMemOrArgMemOnly)))) { CheckFailed("Attributes 'readnone and inaccessiblemem_or_argmemonly' are incompatible!"
, V); return; } } while (0)
1522 "Attributes 'readnone and inaccessiblemem_or_argmemonly' are incompatible!", V)do { if (!(!(Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute
::ReadNone) && Attrs.hasAttribute(AttributeSet::FunctionIndex
, Attribute::InaccessibleMemOrArgMemOnly)))) { CheckFailed("Attributes 'readnone and inaccessiblemem_or_argmemonly' are incompatible!"
, V); return; } } while (0)
;
1523
1524 Assert(do { if (!(!(Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute
::ReadNone) && Attrs.hasAttribute(AttributeSet::FunctionIndex
, Attribute::InaccessibleMemOnly)))) { CheckFailed("Attributes 'readnone and inaccessiblememonly' are incompatible!"
, V); return; } } while (0)
1525 !(Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute::ReadNone) &&do { if (!(!(Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute
::ReadNone) && Attrs.hasAttribute(AttributeSet::FunctionIndex
, Attribute::InaccessibleMemOnly)))) { CheckFailed("Attributes 'readnone and inaccessiblememonly' are incompatible!"
, V); return; } } while (0)
1526 Attrs.hasAttribute(AttributeSet::FunctionIndex,do { if (!(!(Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute
::ReadNone) && Attrs.hasAttribute(AttributeSet::FunctionIndex
, Attribute::InaccessibleMemOnly)))) { CheckFailed("Attributes 'readnone and inaccessiblememonly' are incompatible!"
, V); return; } } while (0)
1527 Attribute::InaccessibleMemOnly)),do { if (!(!(Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute
::ReadNone) && Attrs.hasAttribute(AttributeSet::FunctionIndex
, Attribute::InaccessibleMemOnly)))) { CheckFailed("Attributes 'readnone and inaccessiblememonly' are incompatible!"
, V); return; } } while (0)
1528 "Attributes 'readnone and inaccessiblememonly' are incompatible!", V)do { if (!(!(Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute
::ReadNone) && Attrs.hasAttribute(AttributeSet::FunctionIndex
, Attribute::InaccessibleMemOnly)))) { CheckFailed("Attributes 'readnone and inaccessiblememonly' are incompatible!"
, V); return; } } while (0)
;
1529
1530 Assert(do { if (!(!(Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute
::NoInline) && Attrs.hasAttribute(AttributeSet::FunctionIndex
, Attribute::AlwaysInline)))) { CheckFailed("Attributes 'noinline and alwaysinline' are incompatible!"
, V); return; } } while (0)
1531 !(Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute::NoInline) &&do { if (!(!(Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute
::NoInline) && Attrs.hasAttribute(AttributeSet::FunctionIndex
, Attribute::AlwaysInline)))) { CheckFailed("Attributes 'noinline and alwaysinline' are incompatible!"
, V); return; } } while (0)
1532 Attrs.hasAttribute(AttributeSet::FunctionIndex,do { if (!(!(Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute
::NoInline) && Attrs.hasAttribute(AttributeSet::FunctionIndex
, Attribute::AlwaysInline)))) { CheckFailed("Attributes 'noinline and alwaysinline' are incompatible!"
, V); return; } } while (0)
1533 Attribute::AlwaysInline)),do { if (!(!(Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute
::NoInline) && Attrs.hasAttribute(AttributeSet::FunctionIndex
, Attribute::AlwaysInline)))) { CheckFailed("Attributes 'noinline and alwaysinline' are incompatible!"
, V); return; } } while (0)
1534 "Attributes 'noinline and alwaysinline' are incompatible!", V)do { if (!(!(Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute
::NoInline) && Attrs.hasAttribute(AttributeSet::FunctionIndex
, Attribute::AlwaysInline)))) { CheckFailed("Attributes 'noinline and alwaysinline' are incompatible!"
, V); return; } } while (0)
;
1535
1536 if (Attrs.hasAttribute(AttributeSet::FunctionIndex,
1537 Attribute::OptimizeNone)) {
1538 Assert(Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute::NoInline),do { if (!(Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute
::NoInline))) { CheckFailed("Attribute 'optnone' requires 'noinline'!"
, V); return; } } while (0)
1539 "Attribute 'optnone' requires 'noinline'!", V)do { if (!(Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute
::NoInline))) { CheckFailed("Attribute 'optnone' requires 'noinline'!"
, V); return; } } while (0)
;
1540
1541 Assert(!Attrs.hasAttribute(AttributeSet::FunctionIndex,do { if (!(!Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute
::OptimizeForSize))) { CheckFailed("Attributes 'optsize and optnone' are incompatible!"
, V); return; } } while (0)
1542 Attribute::OptimizeForSize),do { if (!(!Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute
::OptimizeForSize))) { CheckFailed("Attributes 'optsize and optnone' are incompatible!"
, V); return; } } while (0)
1543 "Attributes 'optsize and optnone' are incompatible!", V)do { if (!(!Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute
::OptimizeForSize))) { CheckFailed("Attributes 'optsize and optnone' are incompatible!"
, V); return; } } while (0)
;
1544
1545 Assert(!Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute::MinSize),do { if (!(!Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute
::MinSize))) { CheckFailed("Attributes 'minsize and optnone' are incompatible!"
, V); return; } } while (0)
1546 "Attributes 'minsize and optnone' are incompatible!", V)do { if (!(!Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute
::MinSize))) { CheckFailed("Attributes 'minsize and optnone' are incompatible!"
, V); return; } } while (0)
;
1547 }
1548
1549 if (Attrs.hasAttribute(AttributeSet::FunctionIndex,
1550 Attribute::JumpTable)) {
1551 const GlobalValue *GV = cast<GlobalValue>(V);
1552 Assert(GV->hasUnnamedAddr(),do { if (!(GV->hasUnnamedAddr())) { CheckFailed("Attribute 'jumptable' requires 'unnamed_addr'"
, V); return; } } while (0)
1553 "Attribute 'jumptable' requires 'unnamed_addr'", V)do { if (!(GV->hasUnnamedAddr())) { CheckFailed("Attribute 'jumptable' requires 'unnamed_addr'"
, V); return; } } while (0)
;
1554 }
1555
1556 if (Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute::AllocSize)) {
1557 std::pair<unsigned, Optional<unsigned>> Args =
1558 Attrs.getAllocSizeArgs(AttributeSet::FunctionIndex);
1559
1560 auto CheckParam = [&](StringRef Name, unsigned ParamNo) {
1561 if (ParamNo >= FT->getNumParams()) {
1562 CheckFailed("'allocsize' " + Name + " argument is out of bounds", V);
1563 return false;
1564 }
1565
1566 if (!FT->getParamType(ParamNo)->isIntegerTy()) {
1567 CheckFailed("'allocsize' " + Name +
1568 " argument must refer to an integer parameter",
1569 V);
1570 return false;
1571 }
1572
1573 return true;
1574 };
1575
1576 if (!CheckParam("element size", Args.first))
1577 return;
1578
1579 if (Args.second && !CheckParam("number of elements", *Args.second))
1580 return;
1581 }
1582}
1583
1584void Verifier::verifyFunctionMetadata(
1585 const SmallVector<std::pair<unsigned, MDNode *>, 4> MDs) {
1586 if (MDs.empty())
1587 return;
1588
1589 for (const auto &Pair : MDs) {
1590 if (Pair.first == LLVMContext::MD_prof) {
1591 MDNode *MD = Pair.second;
1592 Assert(MD->getNumOperands() == 2,do { if (!(MD->getNumOperands() == 2)) { CheckFailed("!prof annotations should have exactly 2 operands"
, MD); return; } } while (0)
1593 "!prof annotations should have exactly 2 operands", MD)do { if (!(MD->getNumOperands() == 2)) { CheckFailed("!prof annotations should have exactly 2 operands"
, MD); return; } } while (0)
;
1594
1595 // Check first operand.
1596 Assert(MD->getOperand(0) != nullptr, "first operand should not be null",do { if (!(MD->getOperand(0) != nullptr)) { CheckFailed("first operand should not be null"
, MD); return; } } while (0)
1597 MD)do { if (!(MD->getOperand(0) != nullptr)) { CheckFailed("first operand should not be null"
, MD); return; } } while (0)
;
1598 Assert(isa<MDString>(MD->getOperand(0)),do { if (!(isa<MDString>(MD->getOperand(0)))) { CheckFailed
("expected string with name of the !prof annotation", MD); return
; } } while (0)
1599 "expected string with name of the !prof annotation", MD)do { if (!(isa<MDString>(MD->getOperand(0)))) { CheckFailed
("expected string with name of the !prof annotation", MD); return
; } } while (0)
;
1600 MDString *MDS = cast<MDString>(MD->getOperand(0));
1601 StringRef ProfName = MDS->getString();
1602 Assert(ProfName.equals("function_entry_count"),do { if (!(ProfName.equals("function_entry_count"))) { CheckFailed
("first operand should be 'function_entry_count'", MD); return
; } } while (0)
1603 "first operand should be 'function_entry_count'", MD)do { if (!(ProfName.equals("function_entry_count"))) { CheckFailed
("first operand should be 'function_entry_count'", MD); return
; } } while (0)
;
1604
1605 // Check second operand.
1606 Assert(MD->getOperand(1) != nullptr, "second operand should not be null",do { if (!(MD->getOperand(1) != nullptr)) { CheckFailed("second operand should not be null"
, MD); return; } } while (0)
1607 MD)do { if (!(MD->getOperand(1) != nullptr)) { CheckFailed("second operand should not be null"
, MD); return; } } while (0)
;
1608 Assert(isa<ConstantAsMetadata>(MD->getOperand(1)),do { if (!(isa<ConstantAsMetadata>(MD->getOperand(1)
))) { CheckFailed("expected integer argument to function_entry_count"
, MD); return; } } while (0)
1609 "expected integer argument to function_entry_count", MD)do { if (!(isa<ConstantAsMetadata>(MD->getOperand(1)
))) { CheckFailed("expected integer argument to function_entry_count"
, MD); return; } } while (0)
;
1610 }
1611 }
1612}
1613
1614void Verifier::visitConstantExprsRecursively(const Constant *EntryC) {
1615 if (!ConstantExprVisited.insert(EntryC).second)
1616 return;
1617
1618 SmallVector<const Constant *, 16> Stack;
1619 Stack.push_back(EntryC);
1620
1621 while (!Stack.empty()) {
1622 const Constant *C = Stack.pop_back_val();
1623
1624 // Check this constant expression.
1625 if (const auto *CE = dyn_cast<ConstantExpr>(C))
1626 visitConstantExpr(CE);
1627
1628 if (const auto *GV = dyn_cast<GlobalValue>(C)) {
1629 // Global Values get visited separately, but we do need to make sure
1630 // that the global value is in the correct module
1631 Assert(GV->getParent() == M, "Referencing global in another module!",do { if (!(GV->getParent() == M)) { CheckFailed("Referencing global in another module!"
, EntryC, M, GV, GV->getParent()); return; } } while (0)
1632 EntryC, M, GV, GV->getParent())do { if (!(GV->getParent() == M)) { CheckFailed("Referencing global in another module!"
, EntryC, M, GV, GV->getParent()); return; } } while (0)
;
1633 continue;
1634 }
1635
1636 // Visit all sub-expressions.
1637 for (const Use &U : C->operands()) {
1638 const auto *OpC = dyn_cast<Constant>(U);
1639 if (!OpC)
1640 continue;
1641 if (!ConstantExprVisited.insert(OpC).second)
1642 continue;
1643 Stack.push_back(OpC);
1644 }
1645 }
1646}
1647
1648void Verifier::visitConstantExpr(const ConstantExpr *CE) {
1649 if (CE->getOpcode() != Instruction::BitCast)
1650 return;
1651
1652 Assert(CastInst::castIsValid(Instruction::BitCast, CE->getOperand(0),do { if (!(CastInst::castIsValid(Instruction::BitCast, CE->
getOperand(0), CE->getType()))) { CheckFailed("Invalid bitcast"
, CE); return; } } while (0)
1653 CE->getType()),do { if (!(CastInst::castIsValid(Instruction::BitCast, CE->
getOperand(0), CE->getType()))) { CheckFailed("Invalid bitcast"
, CE); return; } } while (0)
1654 "Invalid bitcast", CE)do { if (!(CastInst::castIsValid(Instruction::BitCast, CE->
getOperand(0), CE->getType()))) { CheckFailed("Invalid bitcast"
, CE); return; } } while (0)
;
1655}
1656
1657bool Verifier::verifyAttributeCount(AttributeSet Attrs, unsigned Params) {
1658 if (Attrs.getNumSlots() == 0)
1659 return true;
1660
1661 unsigned LastSlot = Attrs.getNumSlots() - 1;
1662 unsigned LastIndex = Attrs.getSlotIndex(LastSlot);
1663 if (LastIndex <= Params
1664 || (LastIndex == AttributeSet::FunctionIndex
1665 && (LastSlot == 0 || Attrs.getSlotIndex(LastSlot - 1) <= Params)))
1666 return true;
1667
1668 return false;
1669}
1670
1671/// Verify that statepoint intrinsic is well formed.
1672void Verifier::verifyStatepoint(ImmutableCallSite CS) {
1673 assert(CS.getCalledFunction() &&((CS.getCalledFunction() && CS.getCalledFunction()->
getIntrinsicID() == Intrinsic::experimental_gc_statepoint) ? static_cast
<void> (0) : __assert_fail ("CS.getCalledFunction() && CS.getCalledFunction()->getIntrinsicID() == Intrinsic::experimental_gc_statepoint"
, "/tmp/buildd/llvm-toolchain-snapshot-3.9~svn271203/lib/IR/Verifier.cpp"
, 1675, __PRETTY_FUNCTION__))
1674 CS.getCalledFunction()->getIntrinsicID() ==((CS.getCalledFunction() && CS.getCalledFunction()->
getIntrinsicID() == Intrinsic::experimental_gc_statepoint) ? static_cast
<void> (0) : __assert_fail ("CS.getCalledFunction() && CS.getCalledFunction()->getIntrinsicID() == Intrinsic::experimental_gc_statepoint"
, "/tmp/buildd/llvm-toolchain-snapshot-3.9~svn271203/lib/IR/Verifier.cpp"
, 1675, __PRETTY_FUNCTION__))
1675 Intrinsic::experimental_gc_statepoint)((CS.getCalledFunction() && CS.getCalledFunction()->
getIntrinsicID() == Intrinsic::experimental_gc_statepoint) ? static_cast
<void> (0) : __assert_fail ("CS.getCalledFunction() && CS.getCalledFunction()->getIntrinsicID() == Intrinsic::experimental_gc_statepoint"
, "/tmp/buildd/llvm-toolchain-snapshot-3.9~svn271203/lib/IR/Verifier.cpp"
, 1675, __PRETTY_FUNCTION__))
;
1676
1677 const Instruction &CI = *CS.getInstruction();
1678
1679 Assert(!CS.doesNotAccessMemory() && !CS.onlyReadsMemory() &&do { if (!(!CS.doesNotAccessMemory() && !CS.onlyReadsMemory
() && !CS.onlyAccessesArgMemory())) { CheckFailed("gc.statepoint must read and write all memory to preserve "
"reordering restrictions required by safepoint semantics", &
CI); return; } } while (0)
1680 !CS.onlyAccessesArgMemory(),do { if (!(!CS.doesNotAccessMemory() && !CS.onlyReadsMemory
() && !CS.onlyAccessesArgMemory())) { CheckFailed("gc.statepoint must read and write all memory to preserve "
"reordering restrictions required by safepoint semantics", &
CI); return; } } while (0)
1681 "gc.statepoint must read and write all memory to preserve "do { if (!(!CS.doesNotAccessMemory() && !CS.onlyReadsMemory
() && !CS.onlyAccessesArgMemory())) { CheckFailed("gc.statepoint must read and write all memory to preserve "
"reordering restrictions required by safepoint semantics", &
CI); return; } } while (0)
1682 "reordering restrictions required by safepoint semantics",do { if (!(!CS.doesNotAccessMemory() && !CS.onlyReadsMemory
() && !CS.onlyAccessesArgMemory())) { CheckFailed("gc.statepoint must read and write all memory to preserve "
"reordering restrictions required by safepoint semantics", &
CI); return; } } while (0)
1683 &CI)do { if (!(!CS.doesNotAccessMemory() && !CS.onlyReadsMemory
() && !CS.onlyAccessesArgMemory())) { CheckFailed("gc.statepoint must read and write all memory to preserve "
"reordering restrictions required by safepoint semantics", &
CI); return; } } while (0)
;
1684
1685 const Value *IDV = CS.getArgument(0);
1686 Assert(isa<ConstantInt>(IDV), "gc.statepoint ID must be a constant integer",do { if (!(isa<ConstantInt>(IDV))) { CheckFailed("gc.statepoint ID must be a constant integer"
, &CI); return; } } while (0)
1687 &CI)do { if (!(isa<ConstantInt>(IDV))) { CheckFailed("gc.statepoint ID must be a constant integer"
, &CI); return; } } while (0)
;
1688
1689 const Value *NumPatchBytesV = CS.getArgument(1);
1690 Assert(isa<ConstantInt>(NumPatchBytesV),do { if (!(isa<ConstantInt>(NumPatchBytesV))) { CheckFailed
("gc.statepoint number of patchable bytes must be a constant integer"
, &CI); return; } } while (0)
1691 "gc.statepoint number of patchable bytes must be a constant integer",do { if (!(isa<ConstantInt>(NumPatchBytesV))) { CheckFailed
("gc.statepoint number of patchable bytes must be a constant integer"
, &CI); return; } } while (0)
1692 &CI)do { if (!(isa<ConstantInt>(NumPatchBytesV))) { CheckFailed
("gc.statepoint number of patchable bytes must be a constant integer"
, &CI); return; } } while (0)
;
1693 const int64_t NumPatchBytes =
1694 cast<ConstantInt>(NumPatchBytesV)->getSExtValue();
1695 assert(isInt<32>(NumPatchBytes) && "NumPatchBytesV is an i32!")((isInt<32>(NumPatchBytes) && "NumPatchBytesV is an i32!"
) ? static_cast<void> (0) : __assert_fail ("isInt<32>(NumPatchBytes) && \"NumPatchBytesV is an i32!\""
, "/tmp/buildd/llvm-toolchain-snapshot-3.9~svn271203/lib/IR/Verifier.cpp"
, 1695, __PRETTY_FUNCTION__))
;
1696 Assert(NumPatchBytes >= 0, "gc.statepoint number of patchable bytes must be "do { if (!(NumPatchBytes >= 0)) { CheckFailed("gc.statepoint number of patchable bytes must be "
"positive", &CI); return; } } while (0)
1697 "positive",do { if (!(NumPatchBytes >= 0)) { CheckFailed("gc.statepoint number of patchable bytes must be "
"positive", &CI); return; } } while (0)
1698 &CI)do { if (!(NumPatchBytes >= 0)) { CheckFailed("gc.statepoint number of patchable bytes must be "
"positive", &CI); return; } } while (0)
;
1699
1700 const Value *Target = CS.getArgument(2);
1701 auto *PT = dyn_cast<PointerType>(Target->getType());
1702 Assert(PT && PT->getElementType()->isFunctionTy(),do { if (!(PT && PT->getElementType()->isFunctionTy
())) { CheckFailed("gc.statepoint callee must be of function pointer type"
, &CI, Target); return; } } while (0)
1703 "gc.statepoint callee must be of function pointer type", &CI, Target)do { if (!(PT && PT->getElementType()->isFunctionTy
())) { CheckFailed("gc.statepoint callee must be of function pointer type"
, &CI, Target); return; } } while (0)
;
1704 FunctionType *TargetFuncType = cast<FunctionType>(PT->getElementType());
1705
1706 const Value *NumCallArgsV = CS.getArgument(3);
1707 Assert(isa<ConstantInt>(NumCallArgsV),do { if (!(isa<ConstantInt>(NumCallArgsV))) { CheckFailed
("gc.statepoint number of arguments to underlying call " "must be constant integer"
, &CI); return; } } while (0)
1708 "gc.statepoint number of arguments to underlying call "do { if (!(isa<ConstantInt>(NumCallArgsV))) { CheckFailed
("gc.statepoint number of arguments to underlying call " "must be constant integer"
, &CI); return; } } while (0)
1709 "must be constant integer",do { if (!(isa<ConstantInt>(NumCallArgsV))) { CheckFailed
("gc.statepoint number of arguments to underlying call " "must be constant integer"
, &CI); return; } } while (0)
1710 &CI)do { if (!(isa<ConstantInt>(NumCallArgsV))) { CheckFailed
("gc.statepoint number of arguments to underlying call " "must be constant integer"
, &CI); return; } } while (0)
;
1711 const int NumCallArgs = cast<ConstantInt>(NumCallArgsV)->getZExtValue();
1712 Assert(NumCallArgs >= 0,do { if (!(NumCallArgs >= 0)) { CheckFailed("gc.statepoint number of arguments to underlying call "
"must be positive", &CI); return; } } while (0)
1713 "gc.statepoint number of arguments to underlying call "do { if (!(NumCallArgs >= 0)) { CheckFailed("gc.statepoint number of arguments to underlying call "
"must be positive", &CI); return; } } while (0)
1714 "must be positive",do { if (!(NumCallArgs >= 0)) { CheckFailed("gc.statepoint number of arguments to underlying call "
"must be positive", &CI); return; } } while (0)
1715 &CI)do { if (!(NumCallArgs >= 0)) { CheckFailed("gc.statepoint number of arguments to underlying call "
"must be positive", &CI); return; } } while (0)
;
1716 const int NumParams = (int)TargetFuncType->getNumParams();
1717 if (TargetFuncType->isVarArg()) {
1718 Assert(NumCallArgs >= NumParams,do { if (!(NumCallArgs >= NumParams)) { CheckFailed("gc.statepoint mismatch in number of vararg call args"
, &CI); return; } } while (0)
1719 "gc.statepoint mismatch in number of vararg call args", &CI)do { if (!(NumCallArgs >= NumParams)) { CheckFailed("gc.statepoint mismatch in number of vararg call args"
, &CI); return; } } while (0)
;
1720
1721 // TODO: Remove this limitation
1722 Assert(TargetFuncType->getReturnType()->isVoidTy(),do { if (!(TargetFuncType->getReturnType()->isVoidTy())
) { CheckFailed("gc.statepoint doesn't support wrapping non-void "
"vararg functions yet", &CI); return; } } while (0)
1723 "gc.statepoint doesn't support wrapping non-void "do { if (!(TargetFuncType->getReturnType()->isVoidTy())
) { CheckFailed("gc.statepoint doesn't support wrapping non-void "
"vararg functions yet", &CI); return; } } while (0)
1724 "vararg functions yet",do { if (!(TargetFuncType->getReturnType()->isVoidTy())
) { CheckFailed("gc.statepoint doesn't support wrapping non-void "
"vararg functions yet", &CI); return; } } while (0)
1725 &CI)do { if (!(TargetFuncType->getReturnType()->isVoidTy())
) { CheckFailed("gc.statepoint doesn't support wrapping non-void "
"vararg functions yet", &CI); return; } } while (0)
;
1726 } else
1727 Assert(NumCallArgs == NumParams,do { if (!(NumCallArgs == NumParams)) { CheckFailed("gc.statepoint mismatch in number of call args"
, &CI); return; } } while (0)
1728 "gc.statepoint mismatch in number of call args", &CI)do { if (!(NumCallArgs == NumParams)) { CheckFailed("gc.statepoint mismatch in number of call args"
, &CI); return; } } while (0)
;
1729
1730 const Value *FlagsV = CS.getArgument(4);
1731 Assert(isa<ConstantInt>(FlagsV),do { if (!(isa<ConstantInt>(FlagsV))) { CheckFailed("gc.statepoint flags must be constant integer"
, &CI); return; } } while (0)
1732 "gc.statepoint flags must be constant integer", &CI)do { if (!(isa<ConstantInt>(FlagsV))) { CheckFailed("gc.statepoint flags must be constant integer"
, &CI); return; } } while (0)
;
1733 const uint64_t Flags = cast<ConstantInt>(FlagsV)->getZExtValue();
1734 Assert((Flags & ~(uint64_t)StatepointFlags::MaskAll) == 0,do { if (!((Flags & ~(uint64_t)StatepointFlags::MaskAll) ==
0)) { CheckFailed("unknown flag used in gc.statepoint flags argument"
, &CI); return; } } while (0)
1735 "unknown flag used in gc.statepoint flags argument", &CI)do { if (!((Flags & ~(uint64_t)StatepointFlags::MaskAll) ==
0)) { CheckFailed("unknown flag used in gc.statepoint flags argument"
, &CI); return; } } while (0)
;
1736
1737 // Verify that the types of the call parameter arguments match
1738 // the type of the wrapped callee.
1739 for (int i = 0; i < NumParams; i++) {
1740 Type *ParamType = TargetFuncType->getParamType(i);
1741 Type *ArgType = CS.getArgument(5 + i)->getType();
1742 Assert(ArgType == ParamType,do { if (!(ArgType == ParamType)) { CheckFailed("gc.statepoint call argument does not match wrapped "
"function type", &CI); return; } } while (0)
1743 "gc.statepoint call argument does not match wrapped "do { if (!(ArgType == ParamType)) { CheckFailed("gc.statepoint call argument does not match wrapped "
"function type", &CI); return; } } while (0)
1744 "function type",do { if (!(ArgType == ParamType)) { CheckFailed("gc.statepoint call argument does not match wrapped "
"function type", &CI); return; } } while (0)
1745 &CI)do { if (!(ArgType == ParamType)) { CheckFailed("gc.statepoint call argument does not match wrapped "
"function type", &CI); return; } } while (0)
;
1746 }
1747
1748 const int EndCallArgsInx = 4 + NumCallArgs;
1749
1750 const Value *NumTransitionArgsV = CS.getArgument(EndCallArgsInx+1);
1751 Assert(isa<ConstantInt>(NumTransitionArgsV),do { if (!(isa<ConstantInt>(NumTransitionArgsV))) { CheckFailed
("gc.statepoint number of transition arguments " "must be constant integer"
, &CI); return; } } while (0)
1752 "gc.statepoint number of transition arguments "do { if (!(isa<ConstantInt>(NumTransitionArgsV))) { CheckFailed
("gc.statepoint number of transition arguments " "must be constant integer"
, &CI); return; } } while (0)
1753 "must be constant integer",do { if (!(isa<ConstantInt>(NumTransitionArgsV))) { CheckFailed
("gc.statepoint number of transition arguments " "must be constant integer"
, &CI); return; } } while (0)
1754 &CI)do { if (!(isa<ConstantInt>(NumTransitionArgsV))) { CheckFailed
("gc.statepoint number of transition arguments " "must be constant integer"
, &CI); return; } } while (0)
;
1755 const int NumTransitionArgs =
1756 cast<ConstantInt>(NumTransitionArgsV)->getZExtValue();
1757 Assert(NumTransitionArgs >= 0,do { if (!(NumTransitionArgs >= 0)) { CheckFailed("gc.statepoint number of transition arguments must be positive"
, &CI); return; } } while (0)
1758 "gc.statepoint number of transition arguments must be positive", &CI)do { if (!(NumTransitionArgs >= 0)) { CheckFailed("gc.statepoint number of transition arguments must be positive"
, &CI); return; } } while (0)
;
1759 const int EndTransitionArgsInx = EndCallArgsInx + 1 + NumTransitionArgs;
1760
1761 const Value *NumDeoptArgsV = CS.getArgument(EndTransitionArgsInx+1);
1762 Assert(isa<ConstantInt>(NumDeoptArgsV),do { if (!(isa<ConstantInt>(NumDeoptArgsV))) { CheckFailed
("gc.statepoint number of deoptimization arguments " "must be constant integer"
, &CI); return; } } while (0)
1763 "gc.statepoint number of deoptimization arguments "do { if (!(isa<ConstantInt>(NumDeoptArgsV))) { CheckFailed
("gc.statepoint number of deoptimization arguments " "must be constant integer"
, &CI); return; } } while (0)
1764 "must be constant integer",do { if (!(isa<ConstantInt>(NumDeoptArgsV))) { CheckFailed
("gc.statepoint number of deoptimization arguments " "must be constant integer"
, &CI); return; } } while (0)
1765 &CI)do { if (!(isa<ConstantInt>(NumDeoptArgsV))) { CheckFailed
("gc.statepoint number of deoptimization arguments " "must be constant integer"
, &CI); return; } } while (0)
;
1766 const int NumDeoptArgs = cast<ConstantInt>(NumDeoptArgsV)->getZExtValue();
1767 Assert(NumDeoptArgs >= 0, "gc.statepoint number of deoptimization arguments "do { if (!(NumDeoptArgs >= 0)) { CheckFailed("gc.statepoint number of deoptimization arguments "
"must be positive", &CI); return; } } while (0)
1768 "must be positive",do { if (!(NumDeoptArgs >= 0)) { CheckFailed("gc.statepoint number of deoptimization arguments "
"must be positive", &CI); return; } } while (0)
1769 &CI)do { if (!(NumDeoptArgs >= 0)) { CheckFailed("gc.statepoint number of deoptimization arguments "
"must be positive", &CI); return; } } while (0)
;
1770
1771 const int ExpectedNumArgs =
1772 7 + NumCallArgs + NumTransitionArgs + NumDeoptArgs;
1773 Assert(ExpectedNumArgs <= (int)CS.arg_size(),do { if (!(ExpectedNumArgs <= (int)CS.arg_size())) { CheckFailed
("gc.statepoint too few arguments according to length fields"
, &CI); return; } } while (0)
1774 "gc.statepoint too few arguments according to length fields", &CI)do { if (!(ExpectedNumArgs <= (int)CS.arg_size())) { CheckFailed
("gc.statepoint too few arguments according to length fields"
, &CI); return; } } while (0)
;
1775
1776 // Check that the only uses of this gc.statepoint are gc.result or
1777 // gc.relocate calls which are tied to this statepoint and thus part
1778 // of the same statepoint sequence
1779 for (const User *U : CI.users()) {
1780 const CallInst *Call = dyn_cast<const CallInst>(U);
1781 Assert(Call, "illegal use of statepoint token", &CI, U)do { if (!(Call)) { CheckFailed("illegal use of statepoint token"
, &CI, U); return; } } while (0)
;
1782 if (!Call) continue;
1783 Assert(isa<GCRelocateInst>(Call) || isa<GCResultInst>(Call),do { if (!(isa<GCRelocateInst>(Call) || isa<GCResultInst
>(Call))) { CheckFailed("gc.result or gc.relocate are the only value uses"
"of a gc.statepoint", &CI, U); return; } } while (0)
1784 "gc.result or gc.relocate are the only value uses"do { if (!(isa<GCRelocateInst>(Call) || isa<GCResultInst
>(Call))) { CheckFailed("gc.result or gc.relocate are the only value uses"
"of a gc.statepoint", &CI, U); return; } } while (0)
1785 "of a gc.statepoint",do { if (!(isa<GCRelocateInst>(Call) || isa<GCResultInst
>(Call))) { CheckFailed("gc.result or gc.relocate are the only value uses"
"of a gc.statepoint", &CI, U); return; } } while (0)
1786 &CI, U)do { if (!(isa<GCRelocateInst>(Call) || isa<GCResultInst
>(Call))) { CheckFailed("gc.result or gc.relocate are the only value uses"
"of a gc.statepoint", &CI, U); return; } } while (0)
;
1787 if (isa<GCResultInst>(Call)) {
1788 Assert(Call->getArgOperand(0) == &CI,do { if (!(Call->getArgOperand(0) == &CI)) { CheckFailed
("gc.result connected to wrong gc.statepoint", &CI, Call)
; return; } } while (0)
1789 "gc.result connected to wrong gc.statepoint", &CI, Call)do { if (!(Call->getArgOperand(0) == &CI)) { CheckFailed
("gc.result connected to wrong gc.statepoint", &CI, Call)
; return; } } while (0)
;
1790 } else if (isa<GCRelocateInst>(Call)) {
1791 Assert(Call->getArgOperand(0) == &CI,do { if (!(Call->getArgOperand(0) == &CI)) { CheckFailed
("gc.relocate connected to wrong gc.statepoint", &CI, Call
); return; } } while (0)
1792 "gc.relocate connected to wrong gc.statepoint", &CI, Call)do { if (!(Call->getArgOperand(0) == &CI)) { CheckFailed
("gc.relocate connected to wrong gc.statepoint", &CI, Call
); return; } } while (0)
;
1793 }
1794 }
1795
1796 // Note: It is legal for a single derived pointer to be listed multiple
1797 // times. It's non-optimal, but it is legal. It can also happen after
1798 // insertion if we strip a bitcast away.
1799 // Note: It is really tempting to check that each base is relocated and
1800 // that a derived pointer is never reused as a base pointer. This turns
1801 // out to be problematic since optimizations run after safepoint insertion
1802 // can recognize equality properties that the insertion logic doesn't know
1803 // about. See example statepoint.ll in the verifier subdirectory
1804}
1805
1806void Verifier::verifyFrameRecoverIndices() {
1807 for (auto &Counts : FrameEscapeInfo) {
1808 Function *F = Counts.first;
1809 unsigned EscapedObjectCount = Counts.second.first;
1810 unsigned MaxRecoveredIndex = Counts.second.second;
1811 Assert(MaxRecoveredIndex <= EscapedObjectCount,do { if (!(MaxRecoveredIndex <= EscapedObjectCount)) { CheckFailed
("all indices passed to llvm.localrecover must be less than the "
"number of arguments passed ot llvm.localescape in the parent "
"function", F); return; } } while (0)
1812 "all indices passed to llvm.localrecover must be less than the "do { if (!(MaxRecoveredIndex <= EscapedObjectCount)) { CheckFailed
("all indices passed to llvm.localrecover must be less than the "
"number of arguments passed ot llvm.localescape in the parent "
"function", F); return; } } while (0)
1813 "number of arguments passed ot llvm.localescape in the parent "do { if (!(MaxRecoveredIndex <= EscapedObjectCount)) { CheckFailed
("all indices passed to llvm.localrecover must be less than the "
"number of arguments passed ot llvm.localescape in the parent "
"function", F); return; } } while (0)
1814 "function",do { if (!(MaxRecoveredIndex <= EscapedObjectCount)) { CheckFailed
("all indices passed to llvm.localrecover must be less than the "
"number of arguments passed ot llvm.localescape in the parent "
"function", F); return; } } while (0)
1815 F)do { if (!(MaxRecoveredIndex <= EscapedObjectCount)) { CheckFailed
("all indices passed to llvm.localrecover must be less than the "
"number of arguments passed ot llvm.localescape in the parent "
"function", F); return; } } while (0)
;
1816 }
1817}
1818
1819static Instruction *getSuccPad(TerminatorInst *Terminator) {
1820 BasicBlock *UnwindDest;
1821 if (auto *II = dyn_cast<InvokeInst>(Terminator))
1822 UnwindDest = II->getUnwindDest();
1823 else if (auto *CSI = dyn_cast<CatchSwitchInst>(Terminator))
1824 UnwindDest = CSI->getUnwindDest();
1825 else
1826 UnwindDest = cast<CleanupReturnInst>(Terminator)->getUnwindDest();
1827 return UnwindDest->getFirstNonPHI();
1828}
1829
1830void Verifier::verifySiblingFuncletUnwinds() {
1831 SmallPtrSet<Instruction *, 8> Visited;
1832 SmallPtrSet<Instruction *, 8> Active;
1833 for (const auto &Pair : SiblingFuncletInfo) {
1834 Instruction *PredPad = Pair.first;
1835 if (Visited.count(PredPad))
1836 continue;
1837 Active.insert(PredPad);
1838 TerminatorInst *Terminator = Pair.second;
1839 do {
1840 Instruction *SuccPad = getSuccPad(Terminator);
1841 if (Active.count(SuccPad)) {
1842 // Found a cycle; report error
1843 Instruction *CyclePad = SuccPad;
1844 SmallVector<Instruction *, 8> CycleNodes;
1845 do {
1846 CycleNodes.push_back(CyclePad);
1847 TerminatorInst *CycleTerminator = SiblingFuncletInfo[CyclePad];
1848 if (CycleTerminator != CyclePad)
1849 CycleNodes.push_back(CycleTerminator);
1850 CyclePad = getSuccPad(CycleTerminator);
1851 } while (CyclePad != SuccPad);
1852 Assert(false, "EH pads can't handle each other's exceptions",do { if (!(false)) { CheckFailed("EH pads can't handle each other's exceptions"
, ArrayRef<Instruction *>(CycleNodes)); return; } } while
(0)
1853 ArrayRef<Instruction *>(CycleNodes))do { if (!(false)) { CheckFailed("EH pads can't handle each other's exceptions"
, ArrayRef<Instruction *>(CycleNodes)); return; } } while
(0)
;
1854 }
1855 // Don't re-walk a node we've already checked
1856 if (!Visited.insert(SuccPad).second)
1857 break;
1858 // Walk to this successor if it has a map entry.
1859 PredPad = SuccPad;
1860 auto TermI = SiblingFuncletInfo.find(PredPad);
1861 if (TermI == SiblingFuncletInfo.end())
1862 break;
1863 Terminator = TermI->second;
1864 Active.insert(PredPad);
1865 } while (true);
1866 // Each node only has one successor, so we've walked all the active
1867 // nodes' successors.
1868 Active.clear();
1869 }
1870}
1871
1872// visitFunction - Verify that a function is ok.
1873//
1874void Verifier::visitFunction(const Function &F) {
1875 // Check function arguments.
1876 FunctionType *FT = F.getFunctionType();
1877 unsigned NumArgs = F.arg_size();
1878
1879 Assert(Context == &F.getContext(),do { if (!(Context == &F.getContext())) { CheckFailed("Function context does not match Module context!"
, &F); return; } } while (0)
1880 "Function context does not match Module context!", &F)do { if (!(Context == &F.getContext())) { CheckFailed("Function context does not match Module context!"
, &F); return; } } while (0)
;
1881
1882 Assert(!F.hasCommonLinkage(), "Functions may not have common linkage", &F)do { if (!(!F.hasCommonLinkage())) { CheckFailed("Functions may not have common linkage"
, &F); return; } } while (0)
;
1883 Assert(FT->getNumParams() == NumArgs,do { if (!(FT->getNumParams() == NumArgs)) { CheckFailed("# formal arguments must match # of arguments for function type!"
, &F, FT); return; } } while (0)
1884 "# formal arguments must match # of arguments for function type!", &F,do { if (!(FT->getNumParams() == NumArgs)) { CheckFailed("# formal arguments must match # of arguments for function type!"
, &F, FT); return; } } while (0)
1885 FT)do { if (!(FT->getNumParams() == NumArgs)) { CheckFailed("# formal arguments must match # of arguments for function type!"
, &F, FT); return; } } while (0)
;
1886 Assert(F.getReturnType()->isFirstClassType() ||do { if (!(F.getReturnType()->isFirstClassType() || F.getReturnType
()->isVoidTy() || F.getReturnType()->isStructTy())) { CheckFailed
("Functions cannot return aggregate values!", &F); return
; } } while (0)
1887 F.getReturnType()->isVoidTy() || F.getReturnType()->isStructTy(),do { if (!(F.getReturnType()->isFirstClassType() || F.getReturnType
()->isVoidTy() || F.getReturnType()->isStructTy())) { CheckFailed
("Functions cannot return aggregate values!", &F); return
; } } while (0)
1888 "Functions cannot return aggregate values!", &F)do { if (!(F.getReturnType()->isFirstClassType() || F.getReturnType
()->isVoidTy() || F.getReturnType()->isStructTy())) { CheckFailed
("Functions cannot return aggregate values!", &F); return
; } } while (0)
;
1889
1890 Assert(!F.hasStructRetAttr() || F.getReturnType()->isVoidTy(),do { if (!(!F.hasStructRetAttr() || F.getReturnType()->isVoidTy
())) { CheckFailed("Invalid struct return type!", &F); return
; } } while (0)
1891 "Invalid struct return type!", &F)do { if (!(!F.hasStructRetAttr() || F.getReturnType()->isVoidTy
())) { CheckFailed("Invalid struct return type!", &F); return
; } } while (0)
;
1892
1893 AttributeSet Attrs = F.getAttributes();
1894
1895 Assert(verifyAttributeCount(Attrs, FT->getNumParams()),do { if (!(verifyAttributeCount(Attrs, FT->getNumParams())
)) { CheckFailed("Attribute after last parameter!", &F); return
; } } while (0)
1896 "Attribute after last parameter!", &F)do { if (!(verifyAttributeCount(Attrs, FT->getNumParams())
)) { CheckFailed("Attribute after last parameter!", &F); return
; } } while (0)
;
1897
1898 // Check function attributes.
1899 verifyFunctionAttrs(FT, Attrs, &F);
1900
1901 // On function declarations/definitions, we do not support the builtin
1902 // attribute. We do not check this in VerifyFunctionAttrs since that is
1903 // checking for Attributes that can/can not ever be on functions.
1904 Assert(!Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute::Builtin),do { if (!(!Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute
::Builtin))) { CheckFailed("Attribute 'builtin' can only be applied to a callsite."
, &F); return; } } while (0)
1905 "Attribute 'builtin' can only be applied to a callsite.", &F)do { if (!(!Attrs.hasAttribute(AttributeSet::FunctionIndex, Attribute
::Builtin))) { CheckFailed("Attribute 'builtin' can only be applied to a callsite."
, &F); return; } } while (0)
;
1906
1907 // Check that this function meets the restrictions on this calling convention.
1908 // Sometimes varargs is used for perfectly forwarding thunks, so some of these
1909 // restrictions can be lifted.
1910 switch (F.getCallingConv()) {
1
Control jumps to the 'default' case at line 1911
1911 default:
1912 case CallingConv::C:
1913 break;
2
Execution continues on line 1925
1914 case CallingConv::Fast:
1915 case CallingConv::Cold:
1916 case CallingConv::Intel_OCL_BI:
1917 case CallingConv::PTX_Kernel:
1918 case CallingConv::PTX_Device:
1919 Assert(!F.isVarArg(), "Calling convention does not support varargs or "do { if (!(!F.isVarArg())) { CheckFailed("Calling convention does not support varargs or "
"perfect forwarding!", &F); return; } } while (0)
1920 "perfect forwarding!",do { if (!(!F.isVarArg())) { CheckFailed("Calling convention does not support varargs or "
"perfect forwarding!", &F); return; } } while (0)
1921 &F)do { if (!(!F.isVarArg())) { CheckFailed("Calling convention does not support varargs or "
"perfect forwarding!", &F); return; } } while (0)
;
1922 break;
1923 }
1924
1925 bool isLLVMdotName = F.getName().size() >= 5 &&
1926 F.getName().substr(0, 5) == "llvm.";
1927
1928 // Check that the argument values match the function type for this function...
1929 unsigned i = 0;
1930 for (const Argument &Arg : F.args()) {
1931 Assert(Arg.getType() == FT->getParamType(i),do { if (!(Arg.getType() == FT->getParamType(i))) { CheckFailed
("Argument value does not match function argument type!", &
Arg, FT->getParamType(i)); return; } } while (0)
1932 "Argument value does not match function argument type!", &Arg,do { if (!(Arg.getType() == FT->getParamType(i))) { CheckFailed
("Argument value does not match function argument type!", &
Arg, FT->getParamType(i)); return; } } while (0)
1933 FT->getParamType(i))do { if (!(Arg.getType() == FT->getParamType(i))) { CheckFailed
("Argument value does not match function argument type!", &
Arg, FT->getParamType(i)); return; } } while (0)
;
1934 Assert(Arg.getType()->isFirstClassType(),do { if (!(Arg.getType()->isFirstClassType())) { CheckFailed
("Function arguments must have first-class types!", &Arg)
; return; } } while (0)
1935 "Function arguments must have first-class types!", &Arg)do { if (!(Arg.getType()->isFirstClassType())) { CheckFailed
("Function arguments must have first-class types!", &Arg)
; return; } } while (0)
;
1936 if (!isLLVMdotName) {
1937 Assert(!Arg.getType()->isMetadataTy(),do { if (!(!Arg.getType()->isMetadataTy())) { CheckFailed(
"Function takes metadata but isn't an intrinsic", &Arg, &
F); return; } } while (0)
1938 "Function takes metadata but isn't an intrinsic", &Arg, &F)do { if (!(!Arg.getType()->isMetadataTy())) { CheckFailed(
"Function takes metadata but isn't an intrinsic", &Arg, &
F); return; } } while (0)
;
1939 Assert(!Arg.getType()->isTokenTy(),do { if (!(!Arg.getType()->isTokenTy())) { CheckFailed("Function takes token but isn't an intrinsic"
, &Arg, &F); return; } } while (0)
1940 "Function takes token but isn't an intrinsic", &Arg, &F)do { if (!(!Arg.getType()->isTokenTy())) { CheckFailed("Function takes token but isn't an intrinsic"
, &Arg, &F); return; } } while (0)
;
1941 }
1942
1943 // Check that swifterror argument is only used by loads and stores.
1944 if (Attrs.hasAttribute(i+1, Attribute::SwiftError)) {
1945 verifySwiftErrorValue(&Arg);
1946 }
1947 ++i;
1948 }
1949
1950 if (!isLLVMdotName)
3
Taking true branch
1951 Assert(!F.getReturnType()->isTokenTy(),do { if (!(!F.getReturnType()->isTokenTy())) { CheckFailed
("Functions returns a token but isn't an intrinsic", &F);
return; } } while (0)
1952 "Functions returns a token but isn't an intrinsic", &F)do { if (!(!F.getReturnType()->isTokenTy())) { CheckFailed
("Functions returns a token but isn't an intrinsic", &F);
return; } } while (0)
;
1953
1954 // Get the function metadata attachments.
1955 SmallVector<std::pair<unsigned, MDNode *>, 4> MDs;
1956 F.getAllMetadata(MDs);
1957 assert(F.hasMetadata() != MDs.empty() && "Bit out-of-sync")((F.hasMetadata() != MDs.empty() && "Bit out-of-sync"
) ? static_cast<void> (0) : __assert_fail ("F.hasMetadata() != MDs.empty() && \"Bit out-of-sync\""
, "/tmp/buildd/llvm-toolchain-snapshot-3.9~svn271203/lib/IR/Verifier.cpp"
, 1957, __PRETTY_FUNCTION__))
;
1958 verifyFunctionMetadata(MDs);
1959
1960 // Check validity of the personality function
1961 if (F.hasPersonalityFn()) {
4
Taking false branch
1962 auto *Per = dyn_cast<Function>(F.getPersonalityFn()->stripPointerCasts());
1963 if (Per)
1964 Assert(Per->getParent() == F.getParent(),do { if (!(Per->getParent() == F.getParent())) { CheckFailed
("Referencing personality function in another module!", &
F, F.getParent(), Per, Per->getParent()); return; } } while
(0)
1965 "Referencing personality function in another module!",do { if (!(Per->getParent() == F.getParent())) { CheckFailed
("Referencing personality function in another module!", &
F, F.getParent(), Per, Per->getParent()); return; } } while
(0)
1966 &F, F.getParent(), Per, Per->getParent())do { if (!(Per->getParent() == F.getParent())) { CheckFailed
("Referencing personality function in another module!", &
F, F.getParent(), Per, Per->getParent()); return; } } while
(0)
;
1967 }
1968
1969 if (F.isMaterializable()) {
5
Taking false branch
1970 // Function has a body somewhere we can't see.
1971 Assert(MDs.empty(), "unmaterialized function cannot have metadata", &F,do { if (!(MDs.empty())) { CheckFailed("unmaterialized function cannot have metadata"
, &F, MDs.empty() ? nullptr : MDs.front().second); return
; } } while (0)
1972 MDs.empty() ? nullptr : MDs.front().second)do { if (!(MDs.empty())) { CheckFailed("unmaterialized function cannot have metadata"
, &F, MDs.empty() ? nullptr : MDs.front().second); return
; } } while (0)
;
1973 } else if (F.isDeclaration()) {
6
Taking false branch
1974 Assert(MDs.empty(), "function without a body cannot have metadata", &F,do { if (!(MDs.empty())) { CheckFailed("function without a body cannot have metadata"
, &F, MDs.empty() ? nullptr : MDs.front().second); return
; } } while (0)
1975 MDs.empty() ? nullptr : MDs.front().second)do { if (!(MDs.empty())) { CheckFailed("function without a body cannot have metadata"
, &F, MDs.empty() ? nullptr : MDs.front().second); return
; } } while (0)
;
1976 Assert(!F.hasPersonalityFn(),do { if (!(!F.hasPersonalityFn())) { CheckFailed("Function declaration shouldn't have a personality routine"
, &F); return; } } while (0)
1977 "Function declaration shouldn't have a personality routine", &F)do { if (!(!F.hasPersonalityFn())) { CheckFailed("Function declaration shouldn't have a personality routine"
, &F); return; } } while (0)
;
1978 } else {
1979 // Verify that this function (which has a body) is not named "llvm.*". It
1980 // is not legal to define intrinsics.
1981 Assert(!isLLVMdotName, "llvm intrinsics cannot be defined!", &F)do { if (!(!isLLVMdotName)) { CheckFailed("llvm intrinsics cannot be defined!"
, &F); return; } } while (0)
;
1982
1983 // Check the entry node
1984 const BasicBlock *Entry = &F.getEntryBlock();
1985 Assert(pred_empty(Entry),do { if (!(pred_empty(Entry))) { CheckFailed("Entry block to function must not have predecessors!"
, Entry); return; } } while (0)
1986 "Entry block to function must not have predecessors!", Entry)do { if (!(pred_empty(Entry))) { CheckFailed("Entry block to function must not have predecessors!"
, Entry); return; } } while (0)
;
1987
1988 // The address of the entry block cannot be taken, unless it is dead.
1989 if (Entry->hasAddressTaken()) {
7
Taking false branch
1990 Assert(!BlockAddress::lookup(Entry)->isConstantUsed(),do { if (!(!BlockAddress::lookup(Entry)->isConstantUsed())
) { CheckFailed("blockaddress may not be used with the entry block!"
, Entry); return; } } while (0)
1991 "blockaddress may not be used with the entry block!", Entry)do { if (!(!BlockAddress::lookup(Entry)->isConstantUsed())
) { CheckFailed("blockaddress may not be used with the entry block!"
, Entry); return; } } while (0)
;
1992 }
1993
1994 // Visit metadata attachments.
1995 for (const auto &I : MDs) {
8
Assuming '__begin' is equal to '__end'
1996 // Verify that the attachment is legal.
1997 switch (I.first) {
1998 default:
1999 break;
2000 case LLVMContext::MD_dbg:
2001 AssertDI(isa<DISubprogram>(I.second),do { if (!(isa<DISubprogram>(I.second))) { DebugInfoCheckFailed
("function !dbg attachment must be a subprogram", &F, I.second
); return; } } while (0)
2002 "function !dbg attachment must be a subprogram", &F, I.second)do { if (!(isa<DISubprogram>(I.second))) { DebugInfoCheckFailed
("function !dbg attachment must be a subprogram", &F, I.second
); return; } } while (0)
;
2003 break;
2004 }
2005
2006 // Verify the metadata itself.
2007 visitMDNode(*I.second);
2008 }
2009 }
2010
2011 // If this function is actually an intrinsic, verify that it is only used in
2012 // direct call/invokes, never having its "address taken".
2013 // Only do this if the module is materialized, otherwise we don't have all the
2014 // uses.
2015 if (F.getIntrinsicID() && F.getParent()->isMaterialized()) {
2016 const User *U;
2017 if (F.hasAddressTaken(&U))
2018 Assert(0, "Invalid user of intrinsic instruction!", U)do { if (!(0)) { CheckFailed("Invalid user of intrinsic instruction!"
, U); return; } } while (0)
;
2019 }
2020
2021 Assert(!F.hasDLLImportStorageClass() ||do { if (!(!F.hasDLLImportStorageClass() || (F.isDeclaration(
) && F.hasExternalLinkage()) || F.hasAvailableExternallyLinkage
())) { CheckFailed("Function is marked as dllimport, but not external."
, &F); return; } } while (0)
2022 (F.isDeclaration() && F.hasExternalLinkage()) ||do { if (!(!F.hasDLLImportStorageClass() || (F.isDeclaration(
) && F.hasExternalLinkage()) || F.hasAvailableExternallyLinkage
())) { CheckFailed("Function is marked as dllimport, but not external."
, &F); return; } } while (0)
2023 F.hasAvailableExternallyLinkage(),do { if (!(!F.hasDLLImportStorageClass() || (F.isDeclaration(
) && F.hasExternalLinkage()) || F.hasAvailableExternallyLinkage
())) { CheckFailed("Function is marked as dllimport, but not external."
, &F); return; } } while (0)
2024 "Function is marked as dllimport, but not external.", &F)do { if (!(!F.hasDLLImportStorageClass() || (F.isDeclaration(
) && F.hasExternalLinkage()) || F.hasAvailableExternallyLinkage
())) { CheckFailed("Function is marked as dllimport, but not external."
, &F); return; } } while (0)
;
2025
2026 auto *N = F.getSubprogram();
2027 if (!N)
9
Assuming 'N' is non-null
10
Taking false branch
2028 return;
2029
2030 visitDISubprogram(*N);
2031
2032 // Check that all !dbg attachments lead to back to N (or, at least, another
2033 // subprogram that describes the same function).
2034 //
2035 // FIXME: Check this incrementally while visiting !dbg attachments.
2036 // FIXME: Only check when N is the canonical subprogram for F.
2037 SmallPtrSet<const MDNode *, 32> Seen;
2038 for (auto &BB : F)
2039 for (auto &I : BB) {
2040 // Be careful about using DILocation here since we might be dealing with
2041 // broken code (this is the Verifier after all).
2042 DILocation *DL =
2043 dyn_cast_or_null<DILocation>(I.getDebugLoc().getAsMDNode());
2044 if (!DL)
11
Assuming 'DL' is non-null
12
Taking false branch
2045 continue;
2046 if (!Seen.insert(DL).second)
13
Taking false branch
2047 continue;
2048
2049 DILocalScope *Scope = DL->getInlinedAtScope();
2050 if (Scope && !Seen.insert(Scope).second)
2051 continue;
2052
2053 DISubprogram *SP = Scope ? Scope->getSubprogram() : nullptr;
14
'?' condition is false
15
'SP' initialized to a null pointer value
2054
2055 // Scope and SP could be the same MDNode and we don't want to skip
2056 // validation in that case
2057 if (SP && ((Scope != SP) && !Seen.insert(SP).second))
2058 continue;
2059
2060 // FIXME: Once N is canonical, check "SP == &N".
2061 Assert(SP->describes(&F),do { if (!(SP->describes(&F))) { CheckFailed("!dbg attachment points at wrong subprogram for function"
, N, &F, &I, DL, Scope, SP); return; } } while (0)
16
Within the expansion of the macro 'Assert':
a
Called C++ object pointer is null
2062 "!dbg attachment points at wrong subprogram for function", N, &F,do { if (!(SP->describes(&F))) { CheckFailed("!dbg attachment points at wrong subprogram for function"
, N, &F, &I, DL, Scope, SP); return; } } while (0)
2063 &I, DL, Scope, SP)do { if (!(SP->describes(&F))) { CheckFailed("!dbg attachment points at wrong subprogram for function"
, N, &F, &I, DL, Scope, SP); return; } } while (0)
;
2064 }
2065}
2066
2067// verifyBasicBlock - Verify that a basic block is well formed...
2068//
2069void Verifier::visitBasicBlock(BasicBlock &BB) {
2070 InstsInThisBlock.clear();
2071
2072 // Ensure that basic blocks have terminators!
2073 Assert(BB.getTerminator(), "Basic Block does not have terminator!", &BB)do { if (!(BB.getTerminator())) { CheckFailed("Basic Block does not have terminator!"
, &BB); return; } } while (0)
;
2074
2075 // Check constraints that this basic block imposes on all of the PHI nodes in
2076 // it.
2077 if (isa<PHINode>(BB.front())) {
2078 SmallVector<BasicBlock*, 8> Preds(pred_begin(&BB), pred_end(&BB));
2079 SmallVector<std::pair<BasicBlock*, Value*>, 8> Values;
2080 std::sort(Preds.begin(), Preds.end());
2081 PHINode *PN;
2082 for (BasicBlock::iterator I = BB.begin(); (PN = dyn_cast<PHINode>(I));++I) {
2083 // Ensure that PHI nodes have at least one entry!
2084 Assert(PN->getNumIncomingValues() != 0,do { if (!(PN->getNumIncomingValues() != 0)) { CheckFailed
("PHI nodes must have at least one entry. If the block is dead, "
"the PHI should be removed!", PN); return; } } while (0)
2085 "PHI nodes must have at least one entry. If the block is dead, "do { if (!(PN->getNumIncomingValues() != 0)) { CheckFailed
("PHI nodes must have at least one entry. If the block is dead, "
"the PHI should be removed!", PN); return; } } while (0)
2086 "the PHI should be removed!",do { if (!(PN->getNumIncomingValues() != 0)) { CheckFailed
("PHI nodes must have at least one entry. If the block is dead, "
"the PHI should be removed!", PN); return; } } while (0)
2087 PN)do { if (!(PN->getNumIncomingValues() != 0)) { CheckFailed
("PHI nodes must have at least one entry. If the block is dead, "
"the PHI should be removed!", PN); return; } } while (0)
;
2088 Assert(PN->getNumIncomingValues() == Preds.size(),do { if (!(PN->getNumIncomingValues() == Preds.size())) { CheckFailed
("PHINode should have one entry for each predecessor of its "
"parent basic block!", PN); return; } } while (0)
2089 "PHINode should have one entry for each predecessor of its "do { if (!(PN->getNumIncomingValues() == Preds.size())) { CheckFailed
("PHINode should have one entry for each predecessor of its "
"parent basic block!", PN); return; } } while (0)
2090 "parent basic block!",do { if (!(PN->getNumIncomingValues() == Preds.size())) { CheckFailed
("PHINode should have one entry for each predecessor of its "
"parent basic block!", PN); return; } } while (0)
2091 PN)do { if (!(PN->getNumIncomingValues() == Preds.size())) { CheckFailed
("PHINode should have one entry for each predecessor of its "
"parent basic block!", PN); return; } } while (0)
;
2092
2093 // Get and sort all incoming values in the PHI node...
2094 Values.clear();
2095 Values.reserve(PN->getNumIncomingValues());
2096 for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i)
2097 Values.push_back(std::make_pair(PN->getIncomingBlock(i),
2098 PN->getIncomingValue(i)));
2099 std::sort(Values.begin(), Values.end());
2100
2101 for (unsigned i = 0, e = Values.size(); i != e; ++i) {
2102 // Check to make sure that if there is more than one entry for a
2103 // particular basic block in this PHI node, that the incoming values are
2104 // all identical.
2105 //
2106 Assert(i == 0 || Values[i].first != Values[i - 1].first ||do { if (!(i == 0 || Values[i].first != Values[i - 1].first ||
Values[i].second == Values[i - 1].second)) { CheckFailed("PHI node has multiple entries for the same basic block with "
"different incoming values!", PN, Values[i].first, Values[i]
.second, Values[i - 1].second); return; } } while (0)
2107 Values[i].second == Values[i - 1].second,do { if (!(i == 0 || Values[i].first != Values[i - 1].first ||
Values[i].second == Values[i - 1].second)) { CheckFailed("PHI node has multiple entries for the same basic block with "
"different incoming values!", PN, Values[i].first, Values[i]
.second, Values[i - 1].second); return; } } while (0)
2108 "PHI node has multiple entries for the same basic block with "do { if (!(i == 0 || Values[i].first != Values[i - 1].first ||
Values[i].second == Values[i - 1].second)) { CheckFailed("PHI node has multiple entries for the same basic block with "
"different incoming values!", PN, Values[i].first, Values[i]
.second, Values[i - 1].second); return; } } while (0)
2109 "different incoming values!",do { if (!(i == 0 || Values[i].first != Values[i - 1].first ||
Values[i].second == Values[i - 1].second)) { CheckFailed("PHI node has multiple entries for the same basic block with "
"different incoming values!", PN, Values[i].first, Values[i]
.second, Values[i - 1].second); return; } } while (0)
2110 PN, Values[i].first, Values[i].second, Values[i - 1].second)do { if (!(i == 0 || Values[i].first != Values[i - 1].first ||
Values[i].second == Values[i - 1].second)) { CheckFailed("PHI node has multiple entries for the same basic block with "
"different incoming values!", PN, Values[i].first, Values[i]
.second, Values[i - 1].second); return; } } while (0)
;
2111
2112 // Check to make sure that the predecessors and PHI node entries are
2113 // matched up.
2114 Assert(Values[i].first == Preds[i],do { if (!(Values[i].first == Preds[i])) { CheckFailed("PHI node entries do not match predecessors!"
, PN, Values[i].first, Preds[i]); return; } } while (0)
2115 "PHI node entries do not match predecessors!", PN,do { if (!(Values[i].first == Preds[i])) { CheckFailed("PHI node entries do not match predecessors!"
, PN, Values[i].first, Preds[i]); return; } } while (0)
2116 Values[i].first, Preds[i])do { if (!(Values[i].first == Preds[i])) { CheckFailed("PHI node entries do not match predecessors!"
, PN, Values[i].first, Preds[i]); return; } } while (0)
;
2117 }
2118 }
2119 }
2120
2121 // Check that all instructions have their parent pointers set up correctly.
2122 for (auto &I : BB)
2123 {
2124 Assert(I.getParent() == &BB, "Instruction has bogus parent pointer!")do { if (!(I.getParent() == &BB)) { CheckFailed("Instruction has bogus parent pointer!"
); return; } } while (0)
;
2125 }
2126}
2127
2128void Verifier::visitTerminatorInst(TerminatorInst &I) {
2129 // Ensure that terminators only exist at the end of the basic block.
2130 Assert(&I == I.getParent()->getTerminator(),do { if (!(&I == I.getParent()->getTerminator())) { CheckFailed
("Terminator found in the middle of a basic block!", I.getParent
()); return; } } while (0)
2131 "Terminator found in the middle of a basic block!", I.getParent())do { if (!(&I == I.getParent()->getTerminator())) { CheckFailed
("Terminator found in the middle of a basic block!", I.getParent
()); return; } } while (0)
;
2132 visitInstruction(I);
2133}
2134
2135void Verifier::visitBranchInst(BranchInst &BI) {
2136 if (BI.isConditional()) {
2137 Assert(BI.getCondition()->getType()->isIntegerTy(1),do { if (!(BI.getCondition()->getType()->isIntegerTy(1)
)) { CheckFailed("Branch condition is not 'i1' type!", &BI
, BI.getCondition()); return; } } while (0)
2138 "Branch condition is not 'i1' type!", &BI, BI.getCondition())do { if (!(BI.getCondition()->getType()->isIntegerTy(1)
)) { CheckFailed("Branch condition is not 'i1' type!", &BI
, BI.getCondition()); return; } } while (0)
;
2139 }
2140 visitTerminatorInst(BI);
2141}
2142
2143void Verifier::visitReturnInst(ReturnInst &RI) {
2144 Function *F = RI.getParent()->getParent();
2145 unsigned N = RI.getNumOperands();
2146 if (F->getReturnType()->isVoidTy())
2147 Assert(N == 0,do { if (!(N == 0)) { CheckFailed("Found return instr that returns non-void in Function of void "
"return type!", &RI, F->getReturnType()); return; } }
while (0)
2148 "Found return instr that returns non-void in Function of void "do { if (!(N == 0)) { CheckFailed("Found return instr that returns non-void in Function of void "
"return type!", &RI, F->getReturnType()); return; } }
while (0)
2149 "return type!",do { if (!(N == 0)) { CheckFailed("Found return instr that returns non-void in Function of void "
"return type!", &RI, F->getReturnType()); return; } }
while (0)
2150 &RI, F->getReturnType())do { if (!(N == 0)) { CheckFailed("Found return instr that returns non-void in Function of void "
"return type!", &RI, F->getReturnType()); return; } }
while (0)
;
2151 else
2152 Assert(N == 1 && F->getReturnType() == RI.getOperand(0)->getType(),do { if (!(N == 1 && F->getReturnType() == RI.getOperand
(0)->getType())) { CheckFailed("Function return type does not match operand "
"type of return inst!", &RI, F->getReturnType()); return
; } } while (0)
2153 "Function return type does not match operand "do { if (!(N == 1 && F->getReturnType() == RI.getOperand
(0)->getType())) { CheckFailed("Function return type does not match operand "
"type of return inst!", &RI, F->getReturnType()); return
; } } while (0)
2154 "type of return inst!",do { if (!(N == 1 && F->getReturnType() == RI.getOperand
(0)->getType())) { CheckFailed("Function return type does not match operand "
"type of return inst!", &RI, F->getReturnType()); return
; } } while (0)
2155 &RI, F->getReturnType())do { if (!(N == 1 && F->getReturnType() == RI.getOperand
(0)->getType())) { CheckFailed("Function return type does not match operand "
"type of return inst!", &RI, F->getReturnType()); return
; } } while (0)
;
2156
2157 // Check to make sure that the return value has necessary properties for
2158 // terminators...
2159 visitTerminatorInst(RI);
2160}
2161
2162void Verifier::visitSwitchInst(SwitchInst &SI) {
2163 // Check to make sure that all of the constants in the switch instruction
2164 // have the same type as the switched-on value.
2165 Type *SwitchTy = SI.getCondition()->getType();
2166 SmallPtrSet<ConstantInt*, 32> Constants;
2167 for (auto &Case : SI.cases()) {
2168 Assert(Case.getCaseValue()->getType() == SwitchTy,do { if (!(Case.getCaseValue()->getType() == SwitchTy)) { CheckFailed
("Switch constants must all be same type as switch value!", &
SI); return; } } while (0)
2169 "Switch constants must all be same type as switch value!", &SI)do { if (!(Case.getCaseValue()->getType() == SwitchTy)) { CheckFailed
("Switch constants must all be same type as switch value!", &
SI); return; } } while (0)
;
2170 Assert(Constants.insert(Case.getCaseValue()).second,do { if (!(Constants.insert(Case.getCaseValue()).second)) { CheckFailed
("Duplicate integer as switch case", &SI, Case.getCaseValue
()); return; } } while (0)
2171 "Duplicate integer as switch case", &SI, Case.getCaseValue())do { if (!(Constants.insert(Case.getCaseValue()).second)) { CheckFailed
("Duplicate integer as switch case", &SI, Case.getCaseValue
()); return; } } while (0)
;
2172 }
2173
2174 visitTerminatorInst(SI);
2175}
2176
2177void Verifier::visitIndirectBrInst(IndirectBrInst &BI) {
2178 Assert(BI.getAddress()->getType()->isPointerTy(),do { if (!(BI.getAddress()->getType()->isPointerTy())) {
CheckFailed("Indirectbr operand must have pointer type!", &
BI); return; } } while (0)
2179 "Indirectbr operand must have pointer type!", &BI)do { if (!(BI.getAddress()->getType()->isPointerTy())) {
CheckFailed("Indirectbr operand must have pointer type!", &
BI); return; } } while (0)
;
2180 for (unsigned i = 0, e = BI.getNumDestinations(); i != e; ++i)
2181 Assert(BI.getDestination(i)->getType()->isLabelTy(),do { if (!(BI.getDestination(i)->getType()->isLabelTy()
)) { CheckFailed("Indirectbr destinations must all have pointer type!"
, &BI); return; } } while (0)
2182 "Indirectbr destinations must all have pointer type!", &BI)do { if (!(BI.getDestination(i)->getType()->isLabelTy()
)) { CheckFailed("Indirectbr destinations must all have pointer type!"
, &BI); return; } } while (0)
;
2183
2184 visitTerminatorInst(BI);
2185}
2186
2187void Verifier::visitSelectInst(SelectInst &SI) {
2188 Assert(!SelectInst::areInvalidOperands(SI.getOperand(0), SI.getOperand(1),do { if (!(!SelectInst::areInvalidOperands(SI.getOperand(0), SI
.getOperand(1), SI.getOperand(2)))) { CheckFailed("Invalid operands for select instruction!"
, &SI); return; } } while (0)
2189 SI.getOperand(2)),do { if (!(!SelectInst::areInvalidOperands(SI.getOperand(0), SI
.getOperand(1), SI.getOperand(2)))) { CheckFailed("Invalid operands for select instruction!"
, &SI); return; } } while (0)
2190 "Invalid operands for select instruction!", &SI)do { if (!(!SelectInst::areInvalidOperands(SI.getOperand(0), SI
.getOperand(1), SI.getOperand(2)))) { CheckFailed("Invalid operands for select instruction!"
, &SI); return; } } while (0)
;
2191
2192 Assert(SI.getTrueValue()->getType() == SI.getType(),do { if (!(SI.getTrueValue()->getType() == SI.getType())) {
CheckFailed("Select values must have same type as select instruction!"
, &SI); return; } } while (0)
2193 "Select values must have same type as select instruction!", &SI)do { if (!(SI.getTrueValue()->getType() == SI.getType())) {
CheckFailed("Select values must have same type as select instruction!"
, &SI); return; } } while (0)
;
2194 visitInstruction(SI);
2195}
2196
2197/// visitUserOp1 - User defined operators shouldn't live beyond the lifetime of
2198/// a pass, if any exist, it's an error.
2199///
2200void Verifier::visitUserOp1(Instruction &I) {
2201 Assert(0, "User-defined operators should not live outside of a pass!", &I)do { if (!(0)) { CheckFailed("User-defined operators should not live outside of a pass!"
, &I); return; } } while (0)
;
2202}
2203
2204void Verifier::visitTruncInst(TruncInst &I) {
2205 // Get the source and destination types
2206 Type *SrcTy = I.getOperand(0)->getType();
2207 Type *DestTy = I.getType();
2208
2209 // Get the size of the types in bits, we'll need this later
2210 unsigned SrcBitSize = SrcTy->getScalarSizeInBits();
2211 unsigned DestBitSize = DestTy->getScalarSizeInBits();
2212
2213 Assert(SrcTy->isIntOrIntVectorTy(), "Trunc only operates on integer", &I)do { if (!(SrcTy->isIntOrIntVectorTy())) { CheckFailed("Trunc only operates on integer"
, &I); return; } } while (0)
;
2214 Assert(DestTy->isIntOrIntVectorTy(), "Trunc only produces integer", &I)do { if (!(DestTy->isIntOrIntVectorTy())) { CheckFailed("Trunc only produces integer"
, &I); return; } } while (0)
;
2215 Assert(SrcTy->isVectorTy() == DestTy->isVectorTy(),do { if (!(SrcTy->isVectorTy() == DestTy->isVectorTy())
) { CheckFailed("trunc source and destination must both be a vector or neither"
, &I); return; } } while (0)
2216 "trunc source and destination must both be a vector or neither", &I)do { if (!(SrcTy->isVectorTy() == DestTy->isVectorTy())
) { CheckFailed("trunc source and destination must both be a vector or neither"
, &I); return; } } while (0)
;
2217 Assert(SrcBitSize > DestBitSize, "DestTy too big for Trunc", &I)do { if (!(SrcBitSize > DestBitSize)) { CheckFailed("DestTy too big for Trunc"
, &I); return; } } while (0)
;
2218
2219 visitInstruction(I);
2220}
2221
2222void Verifier::visitZExtInst(ZExtInst &I) {
2223 // Get the source and destination types
2224 Type *SrcTy = I.getOperand(0)->getType();
2225 Type *DestTy = I.getType();
2226
2227 // Get the size of the types in bits, we'll need this later
2228 Assert(SrcTy->isIntOrIntVectorTy(), "ZExt only operates on integer", &I)do { if (!(SrcTy->isIntOrIntVectorTy())) { CheckFailed("ZExt only operates on integer"
, &I); return; } } while (0)
;
2229 Assert(DestTy->isIntOrIntVectorTy(), "ZExt only produces an integer", &I)do { if (!(DestTy->isIntOrIntVectorTy())) { CheckFailed("ZExt only produces an integer"
, &I); return; } } while (0)
;
2230 Assert(SrcTy->isVectorTy() == DestTy->isVectorTy(),do { if (!(SrcTy->isVectorTy() == DestTy->isVectorTy())
) { CheckFailed("zext source and destination must both be a vector or neither"
, &I); return; } } while (0)
2231 "zext source and destination must both be a vector or neither", &I)do { if (!(SrcTy->isVectorTy() == DestTy->isVectorTy())
) { CheckFailed("zext source and destination must both be a vector or neither"
, &I); return; } } while (0)
;
2232 unsigned SrcBitSize = SrcTy->getScalarSizeInBits();
2233 unsigned DestBitSize = DestTy->getScalarSizeInBits();
2234
2235 Assert(SrcBitSize < DestBitSize, "Type too small for ZExt", &I)do { if (!(SrcBitSize < DestBitSize)) { CheckFailed("Type too small for ZExt"
, &I); return; } } while (0)
;
2236
2237 visitInstruction(I);
2238}
2239
2240void Verifier::visitSExtInst(SExtInst &I) {
2241 // Get the source and destination types
2242 Type *SrcTy = I.getOperand(0)->getType();
2243 Type *DestTy = I.getType();
2244
2245 // Get the size of the types in bits, we'll need this later
2246 unsigned SrcBitSize = SrcTy->getScalarSizeInBits();
2247 unsigned DestBitSize = DestTy->getScalarSizeInBits();
2248
2249 Assert(SrcTy->isIntOrIntVectorTy(), "SExt only operates on integer", &I)do { if (!(SrcTy->isIntOrIntVectorTy())) { CheckFailed("SExt only operates on integer"
, &I); return; } } while (0)
;
2250 Assert(DestTy->isIntOrIntVectorTy(), "SExt only produces an integer", &I)do { if (!(DestTy->isIntOrIntVectorTy())) { CheckFailed("SExt only produces an integer"
, &I); return; } } while (0)
;
2251 Assert(SrcTy->isVectorTy() == DestTy->isVectorTy(),do { if (!(SrcTy->isVectorTy() == DestTy->isVectorTy())
) { CheckFailed("sext source and destination must both be a vector or neither"
, &I); return; } } while (0)
2252 "sext source and destination must both be a vector or neither", &I)do { if (!(SrcTy->isVectorTy() == DestTy->isVectorTy())
) { CheckFailed("sext source and destination must both be a vector or neither"
, &I); return; } } while (0)
;
2253 Assert(SrcBitSize < DestBitSize, "Type too small for SExt", &I)do { if (!(SrcBitSize < DestBitSize)) { CheckFailed("Type too small for SExt"
, &I); return; } } while (0)
;
2254
2255 visitInstruction(I);
2256}
2257
2258void Verifier::visitFPTruncInst(FPTruncInst &I) {
2259 // Get the source and destination types
2260 Type *SrcTy = I.getOperand(0)->getType();
2261 Type *DestTy = I.getType();
2262 // Get the size of the types in bits, we'll need this later
2263 unsigned SrcBitSize = SrcTy->getScalarSizeInBits();
2264 unsigned DestBitSize = DestTy->getScalarSizeInBits();
2265
2266 Assert(SrcTy->isFPOrFPVectorTy(), "FPTrunc only operates on FP", &I)do { if (!(SrcTy->isFPOrFPVectorTy())) { CheckFailed("FPTrunc only operates on FP"
, &I); return; } } while (0)
;
2267 Assert(DestTy->isFPOrFPVectorTy(), "FPTrunc only produces an FP", &I)do { if (!(DestTy->isFPOrFPVectorTy())) { CheckFailed("FPTrunc only produces an FP"
, &I); return; } } while (0)
;
2268 Assert(SrcTy->isVectorTy() == DestTy->isVectorTy(),do { if (!(SrcTy->isVectorTy() == DestTy->isVectorTy())
) { CheckFailed("fptrunc source and destination must both be a vector or neither"
, &I); return; } } while (0)
2269 "fptrunc source and destination must both be a vector or neither", &I)do { if (!(SrcTy->isVectorTy() == DestTy->isVectorTy())
) { CheckFailed("fptrunc source and destination must both be a vector or neither"
, &I); return; } } while (0)
;
2270 Assert(SrcBitSize > DestBitSize, "DestTy too big for FPTrunc", &I)do { if (!(SrcBitSize > DestBitSize)) { CheckFailed("DestTy too big for FPTrunc"
, &I); return; } } while (0)
;
2271
2272 visitInstruction(I);
2273}
2274
2275void Verifier::visitFPExtInst(FPExtInst &I) {
2276 // Get the source and destination types
2277 Type *SrcTy = I.getOperand(0)->getType();
2278 Type *DestTy = I.getType();
2279
2280 // Get the size of the types in bits, we'll need this later
2281 unsigned SrcBitSize = SrcTy->getScalarSizeInBits();
2282 unsigned DestBitSize = DestTy->getScalarSizeInBits();
2283
2284 Assert(SrcTy->isFPOrFPVectorTy(), "FPExt only operates on FP", &I)do { if (!(SrcTy->isFPOrFPVectorTy())) { CheckFailed("FPExt only operates on FP"
, &I); return; } } while (0)
;
2285 Assert(DestTy->isFPOrFPVectorTy(), "FPExt only produces an FP", &I)do { if (!(DestTy->isFPOrFPVectorTy())) { CheckFailed("FPExt only produces an FP"
, &I); return; } } while (0)
;
2286 Assert(SrcTy->isVectorTy() == DestTy->isVectorTy(),do { if (!(SrcTy->isVectorTy() == DestTy->isVectorTy())
) { CheckFailed("fpext source and destination must both be a vector or neither"
, &I); return; } } while (0)
2287 "fpext source and destination must both be a vector or neither", &I)do { if (!(SrcTy->isVectorTy() == DestTy->isVectorTy())
) { CheckFailed("fpext source and destination must both be a vector or neither"
, &I); return; } } while (0)
;
2288 Assert(SrcBitSize < DestBitSize, "DestTy too small for FPExt", &I)do { if (!(SrcBitSize < DestBitSize)) { CheckFailed("DestTy too small for FPExt"
, &I); return; } } while (0)
;
2289
2290 visitInstruction(I);
2291}
2292
2293void Verifier::visitUIToFPInst(UIToFPInst &I) {
2294 // Get the source and destination types
2295 Type *SrcTy = I.getOperand(0)->getType();
2296 Type *DestTy = I.getType();
2297
2298 bool SrcVec = SrcTy->isVectorTy();
2299 bool DstVec = DestTy->isVectorTy();
2300
2301 Assert(SrcVec == DstVec,do { if (!(SrcVec == DstVec)) { CheckFailed("UIToFP source and dest must both be vector or scalar"
, &I); return; } } while (0)
2302 "UIToFP source and dest must both be vector or scalar", &I)do { if (!(SrcVec == DstVec)) { CheckFailed("UIToFP source and dest must both be vector or scalar"
, &I); return; } } while (0)
;
2303 Assert(SrcTy->isIntOrIntVectorTy(),do { if (!(SrcTy->isIntOrIntVectorTy())) { CheckFailed("UIToFP source must be integer or integer vector"
, &I); return; } } while (0)
2304 "UIToFP source must be integer or integer vector", &I)do { if (!(SrcTy->isIntOrIntVectorTy())) { CheckFailed("UIToFP source must be integer or integer vector"
, &I); return; } } while (0)
;
2305 Assert(DestTy->isFPOrFPVectorTy(), "UIToFP result must be FP or FP vector",do { if (!(DestTy->isFPOrFPVectorTy())) { CheckFailed("UIToFP result must be FP or FP vector"
, &I); return; } } while (0)
2306 &I)do { if (!(DestTy->isFPOrFPVectorTy())) { CheckFailed("UIToFP result must be FP or FP vector"
, &I); return; } } while (0)
;
2307
2308 if (SrcVec && DstVec)
2309 Assert(cast<VectorType>(SrcTy)->getNumElements() ==do { if (!(cast<VectorType>(SrcTy)->getNumElements()
== cast<VectorType>(DestTy)->getNumElements())) { CheckFailed
("UIToFP source and dest vector length mismatch", &I); return
; } } while (0)
2310 cast<VectorType>(DestTy)->getNumElements(),do { if (!(cast<VectorType>(SrcTy)->getNumElements()
== cast<VectorType>(DestTy)->getNumElements())) { CheckFailed
("UIToFP source and dest vector length mismatch", &I); return
; } } while (0)
2311 "UIToFP source and dest vector length mismatch", &I)do { if (!(cast<VectorType>(SrcTy)->getNumElements()
== cast<VectorType>(DestTy)->getNumElements())) { CheckFailed
("UIToFP source and dest vector length mismatch", &I); return
; } } while (0)
;
2312
2313 visitInstruction(I);
2314}
2315
2316void Verifier::visitSIToFPInst(SIToFPInst &I) {
2317 // Get the source and destination types
2318 Type *SrcTy = I.getOperand(0)->getType();
2319 Type *DestTy = I.getType();
2320
2321 bool SrcVec = SrcTy->isVectorTy();
2322 bool DstVec = DestTy->isVectorTy();
2323
2324 Assert(SrcVec == DstVec,do { if (!(SrcVec == DstVec)) { CheckFailed("SIToFP source and dest must both be vector or scalar"
, &I); return; } } while (0)
2325 "SIToFP source and dest must both be vector or scalar", &I)do { if (!(SrcVec == DstVec)) { CheckFailed("SIToFP source and dest must both be vector or scalar"
, &I); return; } } while (0)
;
2326 Assert(SrcTy->isIntOrIntVectorTy(),do { if (!(SrcTy->isIntOrIntVectorTy())) { CheckFailed("SIToFP source must be integer or integer vector"
, &I); return; } } while (0)
2327 "SIToFP source must be integer or integer vector", &I)do { if (!(SrcTy->isIntOrIntVectorTy())) { CheckFailed("SIToFP source must be integer or integer vector"
, &I); return; } } while (0)
;
2328 Assert(DestTy->isFPOrFPVectorTy(), "SIToFP result must be FP or FP vector",do { if (!(DestTy->isFPOrFPVectorTy())) { CheckFailed("SIToFP result must be FP or FP vector"
, &I); return; } } while (0)
2329 &I)do { if (!(DestTy->isFPOrFPVectorTy())) { CheckFailed("SIToFP result must be FP or FP vector"
, &I); return; } } while (0)
;
2330
2331 if (SrcVec && DstVec)
2332 Assert(cast<VectorType>(SrcTy)->getNumElements() ==do { if (!(cast<VectorType>(SrcTy)->getNumElements()
== cast<VectorType>(DestTy)->getNumElements())) { CheckFailed
("SIToFP source and dest vector length mismatch", &I); return
; } } while (0)
2333 cast<VectorType>(DestTy)->getNumElements(),do { if (!(cast<VectorType>(SrcTy)->getNumElements()
== cast<VectorType>(DestTy)->getNumElements())) { CheckFailed
("SIToFP source and dest vector length mismatch", &I); return
; } } while (0)
2334 "SIToFP source and dest vector length mismatch", &I)do { if (!(cast<VectorType>(SrcTy)->getNumElements()
== cast<VectorType>(DestTy)->getNumElements())) { CheckFailed
("SIToFP source and dest vector length mismatch", &I); return
; } } while (0)
;
2335
2336 visitInstruction(I);
2337}
2338
2339void Verifier::visitFPToUIInst(FPToUIInst &I) {
2340 // Get the source and destination types
2341 Type *SrcTy = I.getOperand(0)->getType();
2342 Type *DestTy = I.getType();
2343
2344 bool SrcVec = SrcTy->isVectorTy();
2345 bool DstVec = DestTy->isVectorTy();
2346
2347 Assert(SrcVec == DstVec,do { if (!(SrcVec == DstVec)) { CheckFailed("FPToUI source and dest must both be vector or scalar"
, &I); return; } } while (0)
2348 "FPToUI source and dest must both be vector or scalar", &I)do { if (!(SrcVec == DstVec)) { CheckFailed("FPToUI source and dest must both be vector or scalar"
, &I); return; } } while (0)
;
2349 Assert(SrcTy->isFPOrFPVectorTy(), "FPToUI source must be FP or FP vector",do { if (!(SrcTy->isFPOrFPVectorTy())) { CheckFailed("FPToUI source must be FP or FP vector"
, &I); return; } } while (0)
2350 &I)do { if (!(SrcTy->isFPOrFPVectorTy())) { CheckFailed("FPToUI source must be FP or FP vector"
, &I); return; } } while (0)
;
2351 Assert(DestTy->isIntOrIntVectorTy(),do { if (!(DestTy->isIntOrIntVectorTy())) { CheckFailed("FPToUI result must be integer or integer vector"
, &I); return; } } while (0)
2352 "FPToUI result must be integer or integer vector", &I)do { if (!(DestTy->isIntOrIntVectorTy())) { CheckFailed("FPToUI result must be integer or integer vector"
, &I); return; } } while (0)
;
2353
2354 if (SrcVec && DstVec)
2355 Assert(cast<VectorType>(SrcTy)->getNumElements() ==do { if (!(cast<VectorType>(SrcTy)->getNumElements()
== cast<VectorType>(DestTy)->getNumElements())) { CheckFailed
("FPToUI source and dest vector length mismatch", &I); return
; } } while (0)
2356 cast<VectorType>(DestTy)->getNumElements(),do { if (!(cast<VectorType>(SrcTy)->getNumElements()
== cast<VectorType>(DestTy)->getNumElements())) { CheckFailed
("FPToUI source and dest vector length mismatch", &I); return
; } } while (0)
2357 "FPToUI source and dest vector length mismatch", &I)do { if (!(cast<VectorType>(SrcTy)->getNumElements()
== cast<VectorType>(DestTy)->getNumElements())) { CheckFailed
("FPToUI source and dest vector length mismatch", &I); return
; } } while (0)
;
2358
2359 visitInstruction(I);
2360}
2361
2362void Verifier::visitFPToSIInst(FPToSIInst &I) {
2363 // Get the source and destination types
2364 Type *SrcTy = I.getOperand(0)->getType();
2365 Type *DestTy = I.getType();
2366
2367 bool SrcVec = SrcTy->isVectorTy();
2368 bool DstVec = DestTy->isVectorTy();
2369
2370 Assert(SrcVec == DstVec,do { if (!(SrcVec == DstVec)) { CheckFailed("FPToSI source and dest must both be vector or scalar"
, &I); return; } } while (0)
2371 "FPToSI source and dest must both be vector or scalar", &I)do { if (!(SrcVec == DstVec)) { CheckFailed("FPToSI source and dest must both be vector or scalar"
, &I); return; } } while (0)
;
2372 Assert(SrcTy->isFPOrFPVectorTy(), "FPToSI source must be FP or FP vector",do { if (!(SrcTy->isFPOrFPVectorTy())) { CheckFailed("FPToSI source must be FP or FP vector"
, &I); return; } } while (0)
2373 &I)do { if (!(SrcTy->isFPOrFPVectorTy())) { CheckFailed("FPToSI source must be FP or FP vector"
, &I); return; } } while (0)
;
2374 Assert(DestTy->isIntOrIntVectorTy(),do { if (!(DestTy->isIntOrIntVectorTy())) { CheckFailed("FPToSI result must be integer or integer vector"
, &I); return; } } while (0)
2375 "FPToSI result must be integer or integer vector", &I)do { if (!(DestTy->isIntOrIntVectorTy())) { CheckFailed("FPToSI result must be integer or integer vector"
, &I); return; } } while (0)
;
2376
2377 if (SrcVec && DstVec)
2378 Assert(cast<VectorType>(SrcTy)->getNumElements() ==do { if (!(cast<VectorType>(SrcTy)->getNumElements()
== cast<VectorType>(DestTy)->getNumElements())) { CheckFailed
("FPToSI source and dest vector length mismatch", &I); return
; } } while (0)
2379 cast<VectorType>(DestTy)->getNumElements(),do { if (!(cast<VectorType>(SrcTy)->getNumElements()
== cast<VectorType>(DestTy)->getNumElements())) { CheckFailed
("FPToSI source and dest vector length mismatch", &I); return
; } } while (0)
2380 "FPToSI source and dest vector length mismatch", &I)do { if (!(cast<VectorType>(SrcTy)->getNumElements()
== cast<VectorType>(DestTy)->getNumElements())) { CheckFailed
("FPToSI source and dest vector length mismatch", &I); return
; } } while (0)
;
2381
2382 visitInstruction(I);
2383}
2384
2385void Verifier::visitPtrToIntInst(PtrToIntInst &I) {
2386 // Get the source and destination types
2387 Type *SrcTy = I.getOperand(0)->getType();
2388 Type *DestTy = I.getType();
2389
2390 Assert(SrcTy->getScalarType()->isPointerTy(),do { if (!(SrcTy->getScalarType()->isPointerTy())) { CheckFailed
("PtrToInt source must be pointer", &I); return; } } while
(0)
2391 "PtrToInt source must be pointer", &I)do { if (!(SrcTy->getScalarType()->isPointerTy())) { CheckFailed
("PtrToInt source must be pointer", &I); return; } } while
(0)
;
2392 Assert(DestTy->getScalarType()->isIntegerTy(),do { if (!(DestTy->getScalarType()->isIntegerTy())) { CheckFailed
("PtrToInt result must be integral", &I); return; } } while
(0)
2393 "PtrToInt result must be integral", &I)do { if (!(DestTy->getScalarType()->isIntegerTy())) { CheckFailed
("PtrToInt result must be integral", &I); return; } } while
(0)
;
2394 Assert(SrcTy->isVectorTy() == DestTy->isVectorTy(), "PtrToInt type mismatch",do { if (!(SrcTy->isVectorTy() == DestTy->isVectorTy())
) { CheckFailed("PtrToInt type mismatch", &I); return; } }
while (0)
2395 &I)do { if (!(SrcTy->isVectorTy() == DestTy->isVectorTy())
) { CheckFailed("PtrToInt type mismatch", &I); return; } }
while (0)
;
2396
2397 if (SrcTy->isVectorTy()) {
2398 VectorType *VSrc = dyn_cast<VectorType>(SrcTy);
2399 VectorType *VDest = dyn_cast<VectorType>(DestTy);
2400 Assert(VSrc->getNumElements() == VDest->getNumElements(),do { if (!(VSrc->getNumElements() == VDest->getNumElements
())) { CheckFailed("PtrToInt Vector width mismatch", &I);
return; } } while (0)
2401 "PtrToInt Vector width mismatch", &I)do { if (!(VSrc->getNumElements() == VDest->getNumElements
())) { CheckFailed("PtrToInt Vector width mismatch", &I);
return; } } while (0)
;
2402 }
2403
2404 visitInstruction(I);
2405}
2406
2407void Verifier::visitIntToPtrInst(IntToPtrInst &I) {
2408 // Get the source and destination types
2409 Type *SrcTy = I.getOperand(0)->getType();
2410 Type *DestTy = I.getType();
2411
2412 Assert(SrcTy->getScalarType()->isIntegerTy(),do { if (!(SrcTy->getScalarType()->isIntegerTy())) { CheckFailed
("IntToPtr source must be an integral", &I); return; } } while
(0)
2413 "IntToPtr source must be an integral", &I)do { if (!(SrcTy->getScalarType()->isIntegerTy())) { CheckFailed
("IntToPtr source must be an integral", &I); return; } } while
(0)
;
2414 Assert(DestTy->getScalarType()->isPointerTy(),do { if (!(DestTy->getScalarType()->isPointerTy())) { CheckFailed
("IntToPtr result must be a pointer", &I); return; } } while
(0)
2415 "IntToPtr result must be a pointer", &I)do { if (!(DestTy->getScalarType()->isPointerTy())) { CheckFailed
("IntToPtr result must be a pointer", &I); return; } } while
(0)
;
2416 Assert(SrcTy->isVectorTy() == DestTy->isVectorTy(), "IntToPtr type mismatch",do { if (!(SrcTy->isVectorTy() == DestTy->isVectorTy())
) { CheckFailed("IntToPtr type mismatch", &I); return; } }
while (0)
2417 &I)do { if (!(SrcTy->isVectorTy() == DestTy->isVectorTy())
) { CheckFailed("IntToPtr type mismatch", &I); return; } }
while (0)
;
2418 if (SrcTy->isVectorTy()) {
2419 VectorType *VSrc = dyn_cast<VectorType>(SrcTy);
2420 VectorType *VDest = dyn_cast<VectorType>(DestTy);
2421 Assert(VSrc->getNumElements() == VDest->getNumElements(),do { if (!(VSrc->getNumElements() == VDest->getNumElements
())) { CheckFailed("IntToPtr Vector width mismatch", &I);
return; } } while (0)
2422 "IntToPtr Vector width mismatch", &I)do { if (!(VSrc->getNumElements() == VDest->getNumElements
())) { CheckFailed("IntToPtr Vector width mismatch", &I);
return; } } while (0)
;
2423 }
2424 visitInstruction(I);
2425}
2426
2427void Verifier::visitBitCastInst(BitCastInst &I) {
2428 Assert(do { if (!(CastInst::castIsValid(Instruction::BitCast, I.getOperand
(0), I.getType()))) { CheckFailed("Invalid bitcast", &I);
return; } } while (0)
2429 CastInst::castIsValid(Instruction::BitCast, I.getOperand(0), I.getType()),do { if (!(CastInst::castIsValid(Instruction::BitCast, I.getOperand
(0), I.getType()))) { CheckFailed("Invalid bitcast", &I);
return; } } while (0)
2430 "Invalid bitcast", &I)do { if (!(CastInst::castIsValid(Instruction::BitCast, I.getOperand
(0), I.getType()))) { CheckFailed("Invalid bitcast", &I);
return; } } while (0)
;
2431 visitInstruction(I);
2432}
2433
2434void Verifier::visitAddrSpaceCastInst(AddrSpaceCastInst &I) {
2435 Type *SrcTy = I.getOperand(0)->getType();
2436 Type *DestTy = I.getType();
2437
2438 Assert(SrcTy->isPtrOrPtrVectorTy(), "AddrSpaceCast source must be a pointer",do { if (!(SrcTy->isPtrOrPtrVectorTy())) { CheckFailed("AddrSpaceCast source must be a pointer"
, &I); return; } } while (0)
2439 &I)do { if (!(SrcTy->isPtrOrPtrVectorTy())) { CheckFailed("AddrSpaceCast source must be a pointer"
, &I); return; } } while (0)
;
2440 Assert(DestTy->isPtrOrPtrVectorTy(), "AddrSpaceCast result must be a pointer",do { if (!(DestTy->isPtrOrPtrVectorTy())) { CheckFailed("AddrSpaceCast result must be a pointer"
, &I); return; } } while (0)
2441 &I)do { if (!(DestTy->isPtrOrPtrVectorTy())) { CheckFailed("AddrSpaceCast result must be a pointer"
, &I); return; } } while (0)
;
2442 Assert(SrcTy->getPointerAddressSpace() != DestTy->getPointerAddressSpace(),do { if (!(SrcTy->getPointerAddressSpace() != DestTy->getPointerAddressSpace
())) { CheckFailed("AddrSpaceCast must be between different address spaces"
, &I); return; } } while (0)
2443 "AddrSpaceCast must be between different address spaces", &I)do { if (!(SrcTy->getPointerAddressSpace() != DestTy->getPointerAddressSpace
())) { CheckFailed("AddrSpaceCast must be between different address spaces"
, &I); return; } } while (0)
;
2444 if (SrcTy->isVectorTy())
2445 Assert(SrcTy->getVectorNumElements() == DestTy->getVectorNumElements(),do { if (!(SrcTy->getVectorNumElements() == DestTy->getVectorNumElements
())) { CheckFailed("AddrSpaceCast vector pointer number of elements mismatch"
, &I); return; } } while (0)
2446 "AddrSpaceCast vector pointer number of elements mismatch", &I)do { if (!(SrcTy->getVectorNumElements() == DestTy->getVectorNumElements
())) { CheckFailed("AddrSpaceCast vector pointer number of elements mismatch"
, &I); return; } } while (0)
;
2447 visitInstruction(I);
2448}
2449
2450/// visitPHINode - Ensure that a PHI node is well formed.
2451///
2452void Verifier::visitPHINode(PHINode &PN) {
2453 // Ensure that the PHI nodes are all grouped together at the top of the block.
2454 // This can be tested by checking whether the instruction before this is
2455 // either nonexistent (because this is begin()) or is a PHI node. If not,
2456 // then there is some other instruction before a PHI.
2457 Assert(&PN == &PN.getParent()->front() ||do { if (!(&PN == &PN.getParent()->front() || isa<
PHINode>(--BasicBlock::iterator(&PN)))) { CheckFailed(
"PHI nodes not grouped at top of basic block!", &PN, PN.getParent
()); return; } } while (0)
2458 isa<PHINode>(--BasicBlock::iterator(&PN)),do { if (!(&PN == &PN.getParent()->front() || isa<
PHINode>(--BasicBlock::iterator(&PN)))) { CheckFailed(
"PHI nodes not grouped at top of basic block!", &PN, PN.getParent
()); return; } } while (0)
2459 "PHI nodes not grouped at top of basic block!", &PN, PN.getParent())do { if (!(&PN == &PN.getParent()->front() || isa<
PHINode>(--BasicBlock::iterator(&PN)))) { CheckFailed(
"PHI nodes not grouped at top of basic block!", &PN, PN.getParent
()); return; } } while (0)
;
2460
2461 // Check that a PHI doesn't yield a Token.
2462 Assert(!PN.getType()->isTokenTy(), "PHI nodes cannot have token type!")do { if (!(!PN.getType()->isTokenTy())) { CheckFailed("PHI nodes cannot have token type!"
); return; } } while (0)
;
2463
2464 // Check that all of the values of the PHI node have the same type as the
2465 // result, and that the incoming blocks are really basic blocks.
2466 for (Value *IncValue : PN.incoming_values()) {
2467 Assert(PN.getType() == IncValue->getType(),do { if (!(PN.getType() == IncValue->getType())) { CheckFailed
("PHI node operands are not the same type as the result!", &
PN); return; } } while (0)
2468 "PHI node operands are not the same type as the result!", &PN)do { if (!(PN.getType() == IncValue->getType())) { CheckFailed
("PHI node operands are not the same type as the result!", &
PN); return; } } while (0)
;
2469 }
2470
2471 // All other PHI node constraints are checked in the visitBasicBlock method.
2472
2473 visitInstruction(PN);
2474}
2475
2476void Verifier::verifyCallSite(CallSite CS) {
2477 Instruction *I = CS.getInstruction();
2478
2479 Assert(CS.getCalledValue()->getType()->isPointerTy(),do { if (!(CS.getCalledValue()->getType()->isPointerTy(
))) { CheckFailed("Called function must be a pointer!", I); return
; } } while (0)
2480 "Called function must be a pointer!", I)do { if (!(CS.getCalledValue()->getType()->isPointerTy(
))) { CheckFailed("Called function must be a pointer!", I); return
; } } while (0)
;
2481 PointerType *FPTy = cast<PointerType>(CS.getCalledValue()->getType());
2482
2483 Assert(FPTy->getElementType()->isFunctionTy(),do { if (!(FPTy->getElementType()->isFunctionTy())) { CheckFailed
("Called function is not pointer to function type!", I); return
; } } while (0)
2484 "Called function is not pointer to function type!", I)do { if (!(FPTy->getElementType()->isFunctionTy())) { CheckFailed
("Called function is not pointer to function type!", I); return
; } } while (0)
;
2485
2486 Assert(FPTy->getElementType() == CS.getFunctionType(),do { if (!(FPTy->getElementType() == CS.getFunctionType())
) { CheckFailed("Called function is not the same type as the call!"
, I); return; } } while (0)
2487 "Called function is not the same type as the call!", I)do { if (!(FPTy->getElementType() == CS.getFunctionType())
) { CheckFailed("Called function is not the same type as the call!"
, I); return; } } while (0)
;
2488
2489 FunctionType *FTy = CS.getFunctionType();
2490
2491 // Verify that the correct number of arguments are being passed
2492 if (FTy->isVarArg())
2493 Assert(CS.arg_size() >= FTy->getNumParams(),do { if (!(CS.arg_size() >= FTy->getNumParams())) { CheckFailed
("Called function requires more parameters than were provided!"
, I); return; } } while (0)
2494 "Called function requires more parameters than were provided!", I)do { if (!(CS.arg_size() >= FTy->getNumParams())) { CheckFailed
("Called function requires more parameters than were provided!"
, I); return; } } while (0)
;
2495 else
2496 Assert(CS.arg_size() == FTy->getNumParams(),do { if (!(CS.arg_size() == FTy->getNumParams())) { CheckFailed
("Incorrect number of arguments passed to called function!", I
); return; } } while (0)
2497 "Incorrect number of arguments passed to called function!", I)do { if (!(CS.arg_size() == FTy->getNumParams())) { CheckFailed
("Incorrect number of arguments passed to called function!", I
); return; } } while (0)
;
2498
2499 // Verify that all arguments to the call match the function type.
2500 for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)
2501 Assert(CS.getArgument(i)->getType() == FTy->getParamType(i),do { if (!(CS.getArgument(i)->getType() == FTy->getParamType
(i))) { CheckFailed("Call parameter type does not match function signature!"
, CS.getArgument(i), FTy->getParamType(i), I); return; } }
while (0)
2502 "Call parameter type does not match function signature!",do { if (!(CS.getArgument(i)->getType() == FTy->getParamType
(i))) { CheckFailed("Call parameter type does not match function signature!"
, CS.getArgument(i), FTy->getParamType(i), I); return; } }
while (0)
2503 CS.getArgument(i), FTy->getParamType(i), I)do { if (!(CS.getArgument(i)->getType() == FTy->getParamType
(i))) { CheckFailed("Call parameter type does not match function signature!"
, CS.getArgument(i), FTy->getParamType(i), I); return; } }
while (0)
;
2504
2505 AttributeSet Attrs = CS.getAttributes();
2506
2507 Assert(verifyAttributeCount(Attrs, CS.arg_size()),do { if (!(verifyAttributeCount(Attrs, CS.arg_size()))) { CheckFailed
("Attribute after last parameter!", I); return; } } while (0)
2508 "Attribute after last parameter!", I)do { if (!(verifyAttributeCount(Attrs, CS.arg_size()))) { CheckFailed
("Attribute after last parameter!", I); return; } } while (0)
;
2509
2510 // Verify call attributes.
2511 verifyFunctionAttrs(FTy, Attrs, I);
2512
2513 // Conservatively check the inalloca argument.
2514 // We have a bug if we can find that there is an underlying alloca without
2515 // inalloca.
2516 if (CS.hasInAllocaArgument()) {
2517 Value *InAllocaArg = CS.getArgument(FTy->getNumParams() - 1);
2518 if (auto AI = dyn_cast<AllocaInst>(InAllocaArg->stripInBoundsOffsets()))
2519 Assert(AI->isUsedWithInAlloca(),do { if (!(AI->isUsedWithInAlloca())) { CheckFailed("inalloca argument for call has mismatched alloca"
, AI, I); return; } } while (0)
2520 "inalloca argument for call has mismatched alloca", AI, I)do { if (!(AI->isUsedWithInAlloca())) { CheckFailed("inalloca argument for call has mismatched alloca"
, AI, I); return; } } while (0)
;
2521 }
2522
2523 // For each argument of the callsite, if it has the swifterror argument,
2524 // make sure the underlying alloca has swifterror as well.
2525 for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)
2526 if (CS.paramHasAttr(i+1, Attribute::SwiftError)) {
2527 Value *SwiftErrorArg = CS.getArgument(i);
2528 auto AI = dyn_cast<AllocaInst>(SwiftErrorArg->stripInBoundsOffsets());
2529 Assert(AI, "swifterror argument should come from alloca", AI, I)do { if (!(AI)) { CheckFailed("swifterror argument should come from alloca"
, AI, I); return; } } while (0)
;
2530 if (AI)
2531 Assert(AI->isSwiftError(),do { if (!(AI->isSwiftError())) { CheckFailed("swifterror argument for call has mismatched alloca"
, AI, I); return; } } while (0)
2532 "swifterror argument for call has mismatched alloca", AI, I)do { if (!(AI->isSwiftError())) { CheckFailed("swifterror argument for call has mismatched alloca"
, AI, I); return; } } while (0)
;
2533 }
2534
2535 if (FTy->isVarArg()) {
2536 // FIXME? is 'nest' even legal here?
2537 bool SawNest = false;
2538 bool SawReturned = false;
2539
2540 for (unsigned Idx = 1; Idx < 1 + FTy->getNumParams(); ++Idx) {
2541 if (Attrs.hasAttribute(Idx, Attribute::Nest))
2542 SawNest = true;
2543 if (Attrs.hasAttribute(Idx, Attribute::Returned))
2544 SawReturned = true;
2545 }
2546
2547 // Check attributes on the varargs part.
2548 for (unsigned Idx = 1 + FTy->getNumParams(); Idx <= CS.arg_size(); ++Idx) {
2549 Type *Ty = CS.getArgument(Idx-1)->getType();
2550 verifyParameterAttrs(Attrs, Idx, Ty, false, I);
2551
2552 if (Attrs.hasAttribute(Idx, Attribute::Nest)) {
2553 Assert(!SawNest, "More than one parameter has attribute nest!", I)do { if (!(!SawNest)) { CheckFailed("More than one parameter has attribute nest!"
, I); return; } } while (0)
;
2554 SawNest = true;
2555 }
2556
2557 if (Attrs.hasAttribute(Idx, Attribute::Returned)) {
2558 Assert(!SawReturned, "More than one parameter has attribute returned!",do { if (!(!SawReturned)) { CheckFailed("More than one parameter has attribute returned!"
, I); return; } } while (0)
2559 I)do { if (!(!SawReturned)) { CheckFailed("More than one parameter has attribute returned!"
, I); return; } } while (0)
;
2560 Assert(Ty->canLosslesslyBitCastTo(FTy->getReturnType()),do { if (!(Ty->canLosslesslyBitCastTo(FTy->getReturnType
()))) { CheckFailed("Incompatible argument and return types for 'returned' "
"attribute", I); return; } } while (0)
2561 "Incompatible argument and return types for 'returned' "do { if (!(Ty->canLosslesslyBitCastTo(FTy->getReturnType
()))) { CheckFailed("Incompatible argument and return types for 'returned' "
"attribute", I); return; } } while (0)
2562 "attribute",do { if (!(Ty->canLosslesslyBitCastTo(FTy->getReturnType
()))) { CheckFailed("Incompatible argument and return types for 'returned' "
"attribute", I); return; } } while (0)
2563 I)do { if (!(Ty->canLosslesslyBitCastTo(FTy->getReturnType
()))) { CheckFailed("Incompatible argument and return types for 'returned' "
"attribute", I); return; } } while (0)
;
2564 SawReturned = true;
2565 }
2566
2567 Assert(!Attrs.hasAttribute(Idx, Attribute::StructRet),do { if (!(!Attrs.hasAttribute(Idx, Attribute::StructRet))) {
CheckFailed("Attribute 'sret' cannot be used for vararg call arguments!"
, I); return; } } while (0)
2568 "Attribute 'sret' cannot be used for vararg call arguments!", I)do { if (!(!Attrs.hasAttribute(Idx, Attribute::StructRet))) {
CheckFailed("Attribute 'sret' cannot be used for vararg call arguments!"
, I); return; } } while (0)
;
2569
2570 if (Attrs.hasAttribute(Idx, Attribute::InAlloca))
2571 Assert(Idx == CS.arg_size(), "inalloca isn't on the last argument!", I)do { if (!(Idx == CS.arg_size())) { CheckFailed("inalloca isn't on the last argument!"
, I); return; } } while (0)
;
2572 }
2573 }
2574
2575 // Verify that there's no metadata unless it's a direct call to an intrinsic.
2576 if (CS.getCalledFunction() == nullptr ||
2577 !CS.getCalledFunction()->getName().startswith("llvm.")) {
2578 for (Type *ParamTy : FTy->params()) {
2579 Assert(!ParamTy->isMetadataTy(),do { if (!(!ParamTy->isMetadataTy())) { CheckFailed("Function has metadata parameter but isn't an intrinsic"
, I); return; } } while (0)
2580 "Function has metadata parameter but isn't an intrinsic", I)do { if (!(!ParamTy->isMetadataTy())) { CheckFailed("Function has metadata parameter but isn't an intrinsic"
, I); return; } } while (0)
;
2581 Assert(!ParamTy->isTokenTy(),do { if (!(!ParamTy->isTokenTy())) { CheckFailed("Function has token parameter but isn't an intrinsic"
, I); return; } } while (0)
2582 "Function has token parameter but isn't an intrinsic", I)do { if (!(!ParamTy->isTokenTy())) { CheckFailed("Function has token parameter but isn't an intrinsic"
, I); return; } } while (0)
;
2583 }
2584 }
2585
2586 // Verify that indirect calls don't return tokens.
2587 if (CS.getCalledFunction() == nullptr)
2588 Assert(!FTy->getReturnType()->isTokenTy(),do { if (!(!FTy->getReturnType()->isTokenTy())) { CheckFailed
("Return type cannot be token for indirect call!"); return; }
} while (0)
2589 "Return type cannot be token for indirect call!")do { if (!(!FTy->getReturnType()->isTokenTy())) { CheckFailed
("Return type cannot be token for indirect call!"); return; }
} while (0)
;
2590
2591 if (Function *F = CS.getCalledFunction())
2592 if (Intrinsic::ID ID = (Intrinsic::ID)F->getIntrinsicID())
2593 visitIntrinsicCallSite(ID, CS);
2594
2595 // Verify that a callsite has at most one "deopt", at most one "funclet" and
2596 // at most one "gc-transition" operand bundle.
2597 bool FoundDeoptBundle = false, FoundFuncletBundle = false,
2598 FoundGCTransitionBundle = false;
2599 for (unsigned i = 0, e = CS.getNumOperandBundles(); i < e; ++i) {
2600 OperandBundleUse BU = CS.getOperandBundleAt(i);
2601 uint32_t Tag = BU.getTagID();
2602 if (Tag == LLVMContext::OB_deopt) {
2603 Assert(!FoundDeoptBundle, "Multiple deopt operand bundles", I)do { if (!(!FoundDeoptBundle)) { CheckFailed("Multiple deopt operand bundles"
, I); return; } } while (0)
;
2604 FoundDeoptBundle = true;
2605 } else if (Tag == LLVMContext::OB_gc_transition) {
2606 Assert(!FoundGCTransitionBundle, "Multiple gc-transition operand bundles",do { if (!(!FoundGCTransitionBundle)) { CheckFailed("Multiple gc-transition operand bundles"
, I); return; } } while (0)
2607 I)do { if (!(!FoundGCTransitionBundle)) { CheckFailed("Multiple gc-transition operand bundles"
, I); return; } } while (0)
;
2608 FoundGCTransitionBundle = true;
2609 } else if (Tag == LLVMContext::OB_funclet) {
2610 Assert(!FoundFuncletBundle, "Multiple funclet operand bundles", I)do { if (!(!FoundFuncletBundle)) { CheckFailed("Multiple funclet operand bundles"
, I); return; } } while (0)
;
2611 FoundFuncletBundle = true;
2612 Assert(BU.Inputs.size() == 1,do { if (!(BU.Inputs.size() == 1)) { CheckFailed("Expected exactly one funclet bundle operand"
, I); return; } } while (0)
2613 "Expected exactly one funclet bundle operand", I)do { if (!(BU.Inputs.size() == 1)) { CheckFailed("Expected exactly one funclet bundle operand"
, I); return; } } while (0)
;
2614 Assert(isa<FuncletPadInst>(BU.Inputs.front()),do { if (!(isa<FuncletPadInst>(BU.Inputs.front()))) { CheckFailed
("Funclet bundle operands should correspond to a FuncletPadInst"
, I); return; } } while (0)
2615 "Funclet bundle operands should correspond to a FuncletPadInst",do { if (!(isa<FuncletPadInst>(BU.Inputs.front()))) { CheckFailed
("Funclet bundle operands should correspond to a FuncletPadInst"
, I); return; } } while (0)
2616 I)do { if (!(isa<FuncletPadInst>(BU.Inputs.front()))) { CheckFailed
("Funclet bundle operands should correspond to a FuncletPadInst"
, I); return; } } while (0)
;
2617 }
2618 }
2619
2620 // Verify that each inlinable callsite of a debug-info-bearing function in a
2621 // debug-info-bearing function has a debug location attached to it. Failure to
2622 // do so causes assertion failures when the inliner sets up inline scope info.
2623 if (I->getFunction()->getSubprogram() && CS.getCalledFunction() &&
2624 CS.getCalledFunction()->getSubprogram())
2625 Assert(I->getDebugLoc(), "inlinable function call in a function with debug "do { if (!(I->getDebugLoc())) { CheckFailed("inlinable function call in a function with debug "
"info must have a !dbg location", I); return; } } while (0)
2626 "info must have a !dbg location",do { if (!(I->getDebugLoc())) { CheckFailed("inlinable function call in a function with debug "
"info must have a !dbg location", I); return; } } while (0)
2627 I)do { if (!(I->getDebugLoc())) { CheckFailed("inlinable function call in a function with debug "
"info must have a !dbg location", I); return; } } while (0)
;
2628
2629 visitInstruction(*I);
2630}
2631
2632/// Two types are "congruent" if they are identical, or if they are both pointer
2633/// types with different pointee types and the same address space.
2634static bool isTypeCongruent(Type *L, Type *R) {
2635 if (L == R)
2636 return true;
2637 PointerType *PL = dyn_cast<PointerType>(L);
2638 PointerType *PR = dyn_cast<PointerType>(R);
2639 if (!PL || !PR)
2640 return false;
2641 return PL->getAddressSpace() == PR->getAddressSpace();
2642}
2643
2644static AttrBuilder getParameterABIAttributes(int I, AttributeSet Attrs) {
2645 static const Attribute::AttrKind ABIAttrs[] = {
2646 Attribute::StructRet, Attribute::ByVal, Attribute::InAlloca,
2647 Attribute::InReg, Attribute::Returned, Attribute::SwiftSelf,
2648 Attribute::SwiftError};
2649 AttrBuilder Copy;
2650 for (auto AK : ABIAttrs) {
2651 if (Attrs.hasAttribute(I + 1, AK))
2652 Copy.addAttribute(AK);
2653 }
2654 if (Attrs.hasAttribute(I + 1, Attribute::Alignment))
2655 Copy.addAlignmentAttr(Attrs.getParamAlignment(I + 1));
2656 return Copy;
2657}
2658
2659void Verifier::verifyMustTailCall(CallInst &CI) {
2660 Assert(!CI.isInlineAsm(), "cannot use musttail call with inline asm", &CI)do { if (!(!CI.isInlineAsm())) { CheckFailed("cannot use musttail call with inline asm"
, &CI); return; } } while (0)
;
2661
2662 // - The caller and callee prototypes must match. Pointer types of
2663 // parameters or return types may differ in pointee type, but not
2664 // address space.
2665 Function *F = CI.getParent()->getParent();
2666 FunctionType *CallerTy = F->getFunctionType();
2667 FunctionType *CalleeTy = CI.getFunctionType();
2668 Assert(CallerTy->getNumParams() == CalleeTy->getNumParams(),do { if (!(CallerTy->getNumParams() == CalleeTy->getNumParams
())) { CheckFailed("cannot guarantee tail call due to mismatched parameter counts"
, &CI); return; } } while (0)
2669 "cannot guarantee tail call due to mismatched parameter counts", &CI)do { if (!(CallerTy->getNumParams() == CalleeTy->getNumParams
())) { CheckFailed("cannot guarantee tail call due to mismatched parameter counts"
, &CI); return; } } while (0)
;
2670 Assert(CallerTy->isVarArg() == CalleeTy->isVarArg(),do { if (!(CallerTy->isVarArg() == CalleeTy->isVarArg()
)) { CheckFailed("cannot guarantee tail call due to mismatched varargs"
, &CI); return; } } while (0)
2671 "cannot guarantee tail call due to mismatched varargs", &CI)do { if (!(CallerTy->isVarArg() == CalleeTy->isVarArg()
)) { CheckFailed("cannot guarantee tail call due to mismatched varargs"
, &CI); return; } } while (0)
;
2672 Assert(isTypeCongruent(CallerTy->getReturnType(), CalleeTy->getReturnType()),do { if (!(isTypeCongruent(CallerTy->getReturnType(), CalleeTy
->getReturnType()))) { CheckFailed("cannot guarantee tail call due to mismatched return types"
, &CI); return; } } while (0)
2673 "cannot guarantee tail call due to mismatched return types", &CI)do { if (!(isTypeCongruent(CallerTy->getReturnType(), CalleeTy
->getReturnType()))) { CheckFailed("cannot guarantee tail call due to mismatched return types"
, &CI); return; } } while (0)
;
2674 for (int I = 0, E = CallerTy->getNumParams(); I != E; ++I) {
2675 Assert(do { if (!(isTypeCongruent(CallerTy->getParamType(I), CalleeTy
->getParamType(I)))) { CheckFailed("cannot guarantee tail call due to mismatched parameter types"
, &CI); return; } } while (0)
2676 isTypeCongruent(CallerTy->getParamType(I), CalleeTy->getParamType(I)),do { if (!(isTypeCongruent(CallerTy->getParamType(I), CalleeTy
->getParamType(I)))) { CheckFailed("cannot guarantee tail call due to mismatched parameter types"
, &CI); return; } } while (0)
2677 "cannot guarantee tail call due to mismatched parameter types", &CI)do { if (!(isTypeCongruent(CallerTy->getParamType(I), CalleeTy
->getParamType(I)))) { CheckFailed("cannot guarantee tail call due to mismatched parameter types"
, &CI); return; } } while (0)
;
2678 }
2679
2680 // - The calling conventions of the caller and callee must match.
2681 Assert(F->getCallingConv() == CI.getCallingConv(),do { if (!(F->getCallingConv() == CI.getCallingConv())) { CheckFailed
("cannot guarantee tail call due to mismatched calling conv",
&CI); return; } } while (0)
2682 "cannot guarantee tail call due to mismatched calling conv", &CI)do { if (!(F->getCallingConv() == CI.getCallingConv())) { CheckFailed
("cannot guarantee tail call due to mismatched calling conv",
&CI); return; } } while (0)
;
2683
2684 // - All ABI-impacting function attributes, such as sret, byval, inreg,
2685 // returned, and inalloca, must match.
2686 AttributeSet CallerAttrs = F->getAttributes();
2687 AttributeSet CalleeAttrs = CI.getAttributes();
2688 for (int I = 0, E = CallerTy->getNumParams(); I != E; ++I) {
2689 AttrBuilder CallerABIAttrs = getParameterABIAttributes(I, CallerAttrs);
2690 AttrBuilder CalleeABIAttrs = getParameterABIAttributes(I, CalleeAttrs);
2691 Assert(CallerABIAttrs == CalleeABIAttrs,do { if (!(CallerABIAttrs == CalleeABIAttrs)) { CheckFailed("cannot guarantee tail call due to mismatched ABI impacting "
"function attributes", &CI, CI.getOperand(I)); return; }
} while (0)
2692 "cannot guarantee tail call due to mismatched ABI impacting "do { if (!(CallerABIAttrs == CalleeABIAttrs)) { CheckFailed("cannot guarantee tail call due to mismatched ABI impacting "
"function attributes", &CI, CI.getOperand(I)); return; }
} while (0)
2693 "function attributes",do { if (!(CallerABIAttrs == CalleeABIAttrs)) { CheckFailed("cannot guarantee tail call due to mismatched ABI impacting "
"function attributes", &CI, CI.getOperand(I)); return; }
} while (0)
2694 &CI, CI.getOperand(I))do { if (!(CallerABIAttrs == CalleeABIAttrs)) { CheckFailed("cannot guarantee tail call due to mismatched ABI impacting "
"function attributes", &CI, CI.getOperand(I)); return; }
} while (0)
;
2695 }
2696
2697 // - The call must immediately precede a :ref:`ret <i_ret>` instruction,
2698 // or a pointer bitcast followed by a ret instruction.
2699 // - The ret instruction must return the (possibly bitcasted) value
2700 // produced by the call or void.
2701 Value *RetVal = &CI;
2702 Instruction *Next = CI.getNextNode();
2703
2704 // Handle the optional bitcast.
2705 if (BitCastInst *BI = dyn_cast_or_null<BitCastInst>(Next)) {
2706 Assert(BI->getOperand(0) == RetVal,do { if (!(BI->getOperand(0) == RetVal)) { CheckFailed("bitcast following musttail call must use the call"
, BI); return; } } while (0)
2707 "bitcast following musttail call must use the call", BI)do { if (!(BI->getOperand(0) == RetVal)) { CheckFailed("bitcast following musttail call must use the call"
, BI); return; } } while (0)
;
2708 RetVal = BI;
2709 Next = BI->getNextNode();
2710 }
2711
2712 // Check the return.
2713 ReturnInst *Ret = dyn_cast_or_null<ReturnInst>(Next);
2714 Assert(Ret, "musttail call must be precede a ret with an optional bitcast",do { if (!(Ret)) { CheckFailed("musttail call must be precede a ret with an optional bitcast"
, &CI); return; } } while (0)
2715 &CI)do { if (!(Ret)) { CheckFailed("musttail call must be precede a ret with an optional bitcast"
, &CI); return; } } while (0)
;
2716 Assert(!Ret->getReturnValue() || Ret->getReturnValue() == RetVal,do { if (!(!Ret->getReturnValue() || Ret->getReturnValue
() == RetVal)) { CheckFailed("musttail call result must be returned"
, Ret); return; } } while (0)
2717 "musttail call result must be returned", Ret)do { if (!(!Ret->getReturnValue() || Ret->getReturnValue
() == RetVal)) { CheckFailed("musttail call result must be returned"
, Ret); return; } } while (0)
;
2718}
2719
2720void Verifier::visitCallInst(CallInst &CI) {
2721 verifyCallSite(&CI);
2722
2723 if (CI.isMustTailCall())
2724 verifyMustTailCall(CI);
2725}
2726
2727void Verifier::visitInvokeInst(InvokeInst &II) {
2728 verifyCallSite(&II);
2729
2730 // Verify that the first non-PHI instruction of the unwind destination is an
2731 // exception handling instruction.
2732 Assert(do { if (!(II.getUnwindDest()->isEHPad())) { CheckFailed("The unwind destination does not have an exception handling instruction!"
, &II); return; } } while (0)
2733 II.getUnwindDest()->isEHPad(),do { if (!(II.getUnwindDest()->isEHPad())) { CheckFailed("The unwind destination does not have an exception handling instruction!"
, &II); return; } } while (0)
2734 "The unwind destination does not have an exception handling instruction!",do { if (!(II.getUnwindDest()->isEHPad())) { CheckFailed("The unwind destination does not have an exception handling instruction!"
, &II); return; } } while (0)
2735 &II)do { if (!(II.getUnwindDest()->isEHPad())) { CheckFailed("The unwind destination does not have an exception handling instruction!"
, &II); return; } } while (0)
;
2736
2737 visitTerminatorInst(II);
2738}
2739
2740/// visitBinaryOperator - Check that both arguments to the binary operator are
2741/// of the same type!
2742///
2743void Verifier::visitBinaryOperator(BinaryOperator &B) {
2744 Assert(B.getOperand(0)->getType() == B.getOperand(1)->getType(),do { if (!(B.getOperand(0)->getType() == B.getOperand(1)->
getType())) { CheckFailed("Both operands to a binary operator are not of the same type!"
, &B); return; } } while (0)
2745 "Both operands to a binary operator are not of the same type!", &B)do { if (!(B.getOperand(0)->getType() == B.getOperand(1)->
getType())) { CheckFailed("Both operands to a binary operator are not of the same type!"
, &B); return; } } while (0)
;
2746
2747 switch (B.getOpcode()) {
2748 // Check that integer arithmetic operators are only used with
2749 // integral operands.
2750 case Instruction::Add:
2751 case Instruction::Sub:
2752 case Instruction::Mul:
2753 case Instruction::SDiv:
2754 case Instruction::UDiv:
2755 case Instruction::SRem:
2756 case Instruction::URem:
2757 Assert(B.getType()->isIntOrIntVectorTy(),do { if (!(B.getType()->isIntOrIntVectorTy())) { CheckFailed
("Integer arithmetic operators only work with integral types!"
, &B); return; } } while (0)
2758 "Integer arithmetic operators only work with integral types!", &B)do { if (!(B.getType()->isIntOrIntVectorTy())) { CheckFailed
("Integer arithmetic operators only work with integral types!"
, &B); return; } } while (0)
;
2759 Assert(B.getType() == B.getOperand(0)->getType(),do { if (!(B.getType() == B.getOperand(0)->getType())) { CheckFailed
("Integer arithmetic operators must have same type " "for operands and result!"
, &B); return; } } while (0)
2760 "Integer arithmetic operators must have same type "do { if (!(B.getType() == B.getOperand(0)->getType())) { CheckFailed
("Integer arithmetic operators must have same type " "for operands and result!"
, &B); return; } } while (0)
2761 "for operands and result!",do { if (!(B.getType() == B.getOperand(0)->getType())) { CheckFailed
("Integer arithmetic operators must have same type " "for operands and result!"
, &B); return; } } while (0)
2762 &B)do { if (!(B.getType() == B.getOperand(0)->getType())) { CheckFailed
("Integer arithmetic operators must have same type " "for operands and result!"
, &B); return; } } while (0)
;
2763 break;
2764 // Check that floating-point arithmetic operators are only used with
2765 // floating-point operands.
2766 case Instruction::FAdd:
2767 case Instruction::FSub:
2768 case Instruction::FMul:
2769 case Instruction::FDiv:
2770 case Instruction::FRem:
2771 Assert(B.getType()->isFPOrFPVectorTy(),do { if (!(B.getType()->isFPOrFPVectorTy())) { CheckFailed
("Floating-point arithmetic operators only work with " "floating-point types!"
, &B); return; } } while (0)
2772 "Floating-point arithmetic operators only work with "do { if (!(B.getType()->isFPOrFPVectorTy())) { CheckFailed
("Floating-point arithmetic operators only work with " "floating-point types!"
, &B); return; } } while (0)
2773 "floating-point types!",do { if (!(B.getType()->isFPOrFPVectorTy())) { CheckFailed
("Floating-point arithmetic operators only work with " "floating-point types!"
, &B); return; } } while (0)
2774 &B)do { if (!(B.getType()->isFPOrFPVectorTy())) { CheckFailed
("Floating-point arithmetic operators only work with " "floating-point types!"
, &B); return; } } while (0)
;
2775 Assert(B.getType() == B.getOperand(0)->getType(),do { if (!(B.getType() == B.getOperand(0)->getType())) { CheckFailed
("Floating-point arithmetic operators must have same type " "for operands and result!"
, &B); return; } } while (0)
2776 "Floating-point arithmetic operators must have same type "do { if (!(B.getType() == B.getOperand(0)->getType())) { CheckFailed
("Floating-point arithmetic operators must have same type " "for operands and result!"
, &B); return; } } while (0)
2777 "for operands and result!",do { if (!(B.getType() == B.getOperand(0)->getType())) { CheckFailed
("Floating-point arithmetic operators must have same type " "for operands and result!"
, &B); return; } } while (0)
2778 &B)do { if (!(B.getType() == B.getOperand(0)->getType())) { CheckFailed
("Floating-point arithmetic operators must have same type " "for operands and result!"
, &B); return; } } while (0)
;
2779 break;
2780 // Check that logical operators are only used with integral operands.
2781 case Instruction::And:
2782 case Instruction::Or:
2783 case Instruction::Xor:
2784 Assert(B.getType()->isIntOrIntVectorTy(),do { if (!(B.getType()->isIntOrIntVectorTy())) { CheckFailed
("Logical operators only work with integral types!", &B);
return; } } while (0)
2785 "Logical operators only work with integral types!", &B)do { if (!(B.getType()->isIntOrIntVectorTy())) { CheckFailed
("Logical operators only work with integral types!", &B);
return; } } while (0)
;
2786 Assert(B.getType() == B.getOperand(0)->getType(),do { if (!(B.getType() == B.getOperand(0)->getType())) { CheckFailed
("Logical operators must have same type for operands and result!"
, &B); return; } } while (0)
2787 "Logical operators must have same type for operands and result!",do { if (!(B.getType() == B.getOperand(0)->getType())) { CheckFailed
("Logical operators must have same type for operands and result!"
, &B); return; } } while (0)
2788 &B)do { if (!(B.getType() == B.getOperand(0)->getType())) { CheckFailed
("Logical operators must have same type for operands and result!"
, &B); return; } } while (0)
;
2789 break;
2790 case Instruction::Shl:
2791 case Instruction::LShr:
2792 case Instruction::AShr:
2793 Assert(B.getType()->isIntOrIntVectorTy(),do { if (!(B.getType()->isIntOrIntVectorTy())) { CheckFailed
("Shifts only work with integral types!", &B); return; } }
while (0)
2794 "Shifts only work with integral types!", &B)do { if (!(B.getType()->isIntOrIntVectorTy())) { CheckFailed
("Shifts only work with integral types!", &B); return; } }
while (0)
;
2795 Assert(B.getType() == B.getOperand(0)->getType(),do { if (!(B.getType() == B.getOperand(0)->getType())) { CheckFailed
("Shift return type must be same as operands!", &B); return
; } } while (0)
2796 "Shift return type must be same as operands!", &B)do { if (!(B.getType() == B.getOperand(0)->getType())) { CheckFailed
("Shift return type must be same as operands!", &B); return
; } } while (0)
;
2797 break;
2798 default:
2799 llvm_unreachable("Unknown BinaryOperator opcode!")::llvm::llvm_unreachable_internal("Unknown BinaryOperator opcode!"
, "/tmp/buildd/llvm-toolchain-snapshot-3.9~svn271203/lib/IR/Verifier.cpp"
, 2799)
;
2800 }
2801
2802 visitInstruction(B);
2803}
2804
2805void Verifier::visitICmpInst(ICmpInst &IC) {
2806 // Check that the operands are the same type
2807 Type *Op0Ty = IC.getOperand(0)->getType();
2808 Type *Op1Ty = IC.getOperand(1)->getType();
2809 Assert(Op0Ty == Op1Ty,do { if (!(Op0Ty == Op1Ty)) { CheckFailed("Both operands to ICmp instruction are not of the same type!"
, &IC); return; } } while (0)
2810 "Both operands to ICmp instruction are not of the same type!", &IC)do { if (!(Op0Ty == Op1Ty)) { CheckFailed("Both operands to ICmp instruction are not of the same type!"
, &IC); return; } } while (0)
;
2811 // Check that the operands are the right type
2812 Assert(Op0Ty->isIntOrIntVectorTy() || Op0Ty->getScalarType()->isPointerTy(),do { if (!(Op0Ty->isIntOrIntVectorTy() || Op0Ty->getScalarType
()->isPointerTy())) { CheckFailed("Invalid operand types for ICmp instruction"
, &IC); return; } } while (0)
2813 "Invalid operand types for ICmp instruction", &IC)do { if (!(Op0Ty->isIntOrIntVectorTy() || Op0Ty->getScalarType
()->isPointerTy())) { CheckFailed("Invalid operand types for ICmp instruction"
, &IC); return; } } while (0)
;
2814 // Check that the predicate is valid.
2815 Assert(IC.getPredicate() >= CmpInst::FIRST_ICMP_PREDICATE &&do { if (!(IC.getPredicate() >= CmpInst::FIRST_ICMP_PREDICATE
&& IC.getPredicate() <= CmpInst::LAST_ICMP_PREDICATE
)) { CheckFailed("Invalid predicate in ICmp instruction!", &
IC); return; } } while (0)
2816 IC.getPredicate() <= CmpInst::LAST_ICMP_PREDICATE,do { if (!(IC.getPredicate() >= CmpInst::FIRST_ICMP_PREDICATE
&& IC.getPredicate() <= CmpInst::LAST_ICMP_PREDICATE
)) { CheckFailed("Invalid predicate in ICmp instruction!", &
IC); return; } } while (0)
2817 "Invalid predicate in ICmp instruction!", &IC)do { if (!(IC.getPredicate() >= CmpInst::FIRST_ICMP_PREDICATE
&& IC.getPredicate() <= CmpInst::LAST_ICMP_PREDICATE
)) { CheckFailed("Invalid predicate in ICmp instruction!", &
IC); return; } } while (0)
;
2818
2819 visitInstruction(IC);
2820}
2821
2822void Verifier::visitFCmpInst(FCmpInst &FC) {
2823 // Check that the operands are the same type
2824 Type *Op0Ty = FC.getOperand(0)->getType();
2825 Type *Op1Ty = FC.getOperand(1)->getType();
2826 Assert(Op0Ty == Op1Ty,do { if (!(Op0Ty == Op1Ty)) { CheckFailed("Both operands to FCmp instruction are not of the same type!"
, &FC); return; } } while (0)
2827 "Both operands to FCmp instruction are not of the same type!", &FC)do { if (!(Op0Ty == Op1Ty)) { CheckFailed("Both operands to FCmp instruction are not of the same type!"
, &FC); return; } } while (0)
;
2828 // Check that the operands are the right type
2829 Assert(Op0Ty->isFPOrFPVectorTy(),do { if (!(Op0Ty->isFPOrFPVectorTy())) { CheckFailed("Invalid operand types for FCmp instruction"
, &FC); return; } } while (0)
2830 "Invalid operand types for FCmp instruction", &FC)do { if (!(Op0Ty->isFPOrFPVectorTy())) { CheckFailed("Invalid operand types for FCmp instruction"
, &FC); return; } } while (0)
;
2831 // Check that the predicate is valid.
2832 Assert(FC.getPredicate() >= CmpInst::FIRST_FCMP_PREDICATE &&do { if (!(FC.getPredicate() >= CmpInst::FIRST_FCMP_PREDICATE
&& FC.getPredicate() <= CmpInst::LAST_FCMP_PREDICATE
)) { CheckFailed("Invalid predicate in FCmp instruction!", &
FC); return; } } while (0)
2833 FC.getPredicate() <= CmpInst::LAST_FCMP_PREDICATE,do { if (!(FC.getPredicate() >= CmpInst::FIRST_FCMP_PREDICATE
&& FC.getPredicate() <= CmpInst::LAST_FCMP_PREDICATE
)) { CheckFailed("Invalid predicate in FCmp instruction!", &
FC); return; } } while (0)
2834 "Invalid predicate in FCmp instruction!", &FC)do { if (!(FC.getPredicate() >= CmpInst::FIRST_FCMP_PREDICATE
&& FC.getPredicate() <= CmpInst::LAST_FCMP_PREDICATE
)) { CheckFailed("Invalid predicate in FCmp instruction!", &
FC); return; } } while (0)
;
2835
2836 visitInstruction(FC);
2837}
2838
2839void Verifier::visitExtractElementInst(ExtractElementInst &EI) {
2840 Assert(do { if (!(ExtractElementInst::isValidOperands(EI.getOperand(
0), EI.getOperand(1)))) { CheckFailed("Invalid extractelement operands!"
, &EI); return; } } while (0)
2841 ExtractElementInst::isValidOperands(EI.getOperand(0), EI.getOperand(1)),do { if (!(ExtractElementInst::isValidOperands(EI.getOperand(
0), EI.getOperand(1)))) { CheckFailed("Invalid extractelement operands!"
, &EI); return; } } while (0)
2842 "Invalid extractelement operands!", &EI)do { if (!(ExtractElementInst::isValidOperands(EI.getOperand(
0), EI.getOperand(1)))) { CheckFailed("Invalid extractelement operands!"
, &EI); return; } } while (0)
;
2843 visitInstruction(EI);
2844}
2845
2846void Verifier::visitInsertElementInst(InsertElementInst &IE) {
2847 Assert(InsertElementInst::isValidOperands(IE.getOperand(0), IE.getOperand(1),do { if (!(InsertElementInst::isValidOperands(IE.getOperand(0
), IE.getOperand(1), IE.getOperand(2)))) { CheckFailed("Invalid insertelement operands!"
, &IE); return; } } while (0)
2848 IE.getOperand(2)),do { if (!(InsertElementInst::isValidOperands(IE.getOperand(0
), IE.getOperand(1), IE.getOperand(2)))) { CheckFailed("Invalid insertelement operands!"
, &IE); return; } } while (0)
2849 "Invalid insertelement operands!", &IE)do { if (!(InsertElementInst::isValidOperands(IE.getOperand(0
), IE.getOperand(1), IE.getOperand(2)))) { CheckFailed("Invalid insertelement operands!"
, &IE); return; } } while (0)
;
2850 visitInstruction(IE);
2851}
2852
2853void Verifier::visitShuffleVectorInst(ShuffleVectorInst &SV) {
2854 Assert(ShuffleVectorInst::isValidOperands(SV.getOperand(0), SV.getOperand(1),do { if (!(ShuffleVectorInst::isValidOperands(SV.getOperand(0
), SV.getOperand(1), SV.getOperand(2)))) { CheckFailed("Invalid shufflevector operands!"
, &SV); return; } } while (0)
2855 SV.getOperand(2)),do { if (!(ShuffleVectorInst::isValidOperands(SV.getOperand(0
), SV.getOperand(1), SV.getOperand(2)))) { CheckFailed("Invalid shufflevector operands!"
, &SV); return; } } while (0)
2856 "Invalid shufflevector operands!", &SV)do { if (!(ShuffleVectorInst::isValidOperands(SV.getOperand(0
), SV.getOperand(1), SV.getOperand(2)))) { CheckFailed("Invalid shufflevector operands!"
, &SV); return; } } while (0)
;
2857 visitInstruction(SV);
2858}
2859
2860void Verifier::visitGetElementPtrInst(GetElementPtrInst &GEP) {
2861 Type *TargetTy = GEP.getPointerOperandType()->getScalarType();
2862
2863 Assert(isa<PointerType>(TargetTy),do { if (!(isa<PointerType>(TargetTy))) { CheckFailed("GEP base pointer is not a vector or a vector of pointers"
, &GEP); return; } } while (0)
2864 "GEP base pointer is not a vector or a vector of pointers", &GEP)do { if (!(isa<PointerType>(TargetTy))) { CheckFailed("GEP base pointer is not a vector or a vector of pointers"
, &GEP); return; } } while (0)
;
2865 Assert(GEP.getSourceElementType()->isSized(), "GEP into unsized type!", &GEP)do { if (!(GEP.getSourceElementType()->isSized())) { CheckFailed
("GEP into unsized type!", &GEP); return; } } while (0)
;
2866 SmallVector<Value*, 16> Idxs(GEP.idx_begin(), GEP.idx_end());
2867 Type *ElTy =
2868 GetElementPtrInst::getIndexedType(GEP.getSourceElementType(), Idxs);
2869 Assert(ElTy, "Invalid indices for GEP pointer type!", &GEP)do { if (!(ElTy)) { CheckFailed("Invalid indices for GEP pointer type!"
, &GEP); return; } } while (0)
;
2870
2871 Assert(GEP.getType()->getScalarType()->isPointerTy() &&do { if (!(GEP.getType()->getScalarType()->isPointerTy(
) && GEP.getResultElementType() == ElTy)) { CheckFailed
("GEP is not of right type for indices!", &GEP, ElTy); return
; } } while (0)
2872 GEP.getResultElementType() == ElTy,do { if (!(GEP.getType()->getScalarType()->isPointerTy(
) && GEP.getResultElementType() == ElTy)) { CheckFailed
("GEP is not of right type for indices!", &GEP, ElTy); return
; } } while (0)
2873 "GEP is not of right type for indices!", &GEP, ElTy)do { if (!(GEP.getType()->getScalarType()->isPointerTy(
) && GEP.getResultElementType() == ElTy)) { CheckFailed
("GEP is not of right type for indices!", &GEP, ElTy); return
; } } while (0)
;
2874
2875 if (GEP.getType()->isVectorTy()) {
2876 // Additional checks for vector GEPs.
2877 unsigned GEPWidth = GEP.getType()->getVectorNumElements();
2878 if (GEP.getPointerOperandType()->isVectorTy())
2879 Assert(GEPWidth == GEP.getPointerOperandType()->getVectorNumElements(),do { if (!(GEPWidth == GEP.getPointerOperandType()->getVectorNumElements
())) { CheckFailed("Vector GEP result width doesn't match operand's"
, &GEP); return; } } while (0)
2880 "Vector GEP result width doesn't match operand's", &GEP)do { if (!(GEPWidth == GEP.getPointerOperandType()->getVectorNumElements
())) { CheckFailed("Vector GEP result width doesn't match operand's"
, &GEP); return; } } while (0)
;
2881 for (Value *Idx : Idxs) {
2882 Type *IndexTy = Idx->getType();
2883 if (IndexTy->isVectorTy()) {
2884 unsigned IndexWidth = IndexTy->getVectorNumElements();
2885 Assert(IndexWidth == GEPWidth, "Invalid GEP index vector width", &GEP)do { if (!(IndexWidth == GEPWidth)) { CheckFailed("Invalid GEP index vector width"
, &GEP); return; } } while (0)
;
2886 }
2887 Assert(IndexTy->getScalarType()->isIntegerTy(),do { if (!(IndexTy->getScalarType()->isIntegerTy())) { CheckFailed
("All GEP indices should be of integer type"); return; } } while
(0)
2888 "All GEP indices should be of integer type")do { if (!(IndexTy->getScalarType()->isIntegerTy())) { CheckFailed
("All GEP indices should be of integer type"); return; } } while
(0)
;
2889 }
2890 }
2891 visitInstruction(GEP);
2892}
2893
2894static bool isContiguous(const ConstantRange &A, const ConstantRange &B) {
2895 return A.getUpper() == B.getLower() || A.getLower() == B.getUpper();
2896}
2897
2898void Verifier::visitRangeMetadata(Instruction& I,
2899 MDNode* Range, Type* Ty) {
2900 assert(Range &&((Range && Range == I.getMetadata(LLVMContext::MD_range
) && "precondition violation") ? static_cast<void>
(0) : __assert_fail ("Range && Range == I.getMetadata(LLVMContext::MD_range) && \"precondition violation\""
, "/tmp/buildd/llvm-toolchain-snapshot-3.9~svn271203/lib/IR/Verifier.cpp"
, 2902, __PRETTY_FUNCTION__))
2901 Range == I.getMetadata(LLVMContext::MD_range) &&((Range && Range == I.getMetadata(LLVMContext::MD_range
) && "precondition violation") ? static_cast<void>
(0) : __assert_fail ("Range && Range == I.getMetadata(LLVMContext::MD_range) && \"precondition violation\""
, "/tmp/buildd/llvm-toolchain-snapshot-3.9~svn271203/lib/IR/Verifier.cpp"
, 2902, __PRETTY_FUNCTION__))
2902 "precondition violation")((Range && Range == I.getMetadata(LLVMContext::MD_range
) && "precondition violation") ? static_cast<void>
(0) : __assert_fail ("Range && Range == I.getMetadata(LLVMContext::MD_range) && \"precondition violation\""
, "/tmp/buildd/llvm-toolchain-snapshot-3.9~svn271203/lib/IR/Verifier.cpp"
, 2902, __PRETTY_FUNCTION__))
;
2903
2904 unsigned NumOperands = Range->getNumOperands();
2905 Assert(NumOperands % 2 == 0, "Unfinished range!", Range)do { if (!(NumOperands % 2 == 0)) { CheckFailed("Unfinished range!"
, Range); return; } } while (0)
;
2906 unsigned NumRanges = NumOperands / 2;
2907 Assert(NumRanges >= 1, "It should have at least one range!", Range)do { if (!(NumRanges >= 1)) { CheckFailed("It should have at least one range!"
, Range); return; } } while (0)
;
2908
2909 ConstantRange LastRange(1); // Dummy initial value
2910 for (unsigned i = 0; i < NumRanges; ++i) {
2911 ConstantInt *Low =
2912 mdconst::dyn_extract<ConstantInt>(Range->getOperand(2 * i));
2913 Assert(Low, "The lower limit must be an integer!", Low)do { if (!(Low)) { CheckFailed("The lower limit must be an integer!"
, Low); return; } } while (0)
;
2914 ConstantInt *High =
2915 mdconst::dyn_extract<ConstantInt>(Range->getOperand(2 * i + 1));
2916 Assert(High, "The upper limit must be an integer!", High)do { if (!(High)) { CheckFailed("The upper limit must be an integer!"
, High); return; } } while (0)
;
2917 Assert(High->getType() == Low->getType() && High->getType() == Ty,do { if (!(High->getType() == Low->getType() &&
High->getType() == Ty)) { CheckFailed("Range types must match instruction type!"
, &I); return; } } while (0)
2918 "Range types must match instruction type!", &I)do { if (!(High->getType() == Low->getType() &&
High->getType() == Ty)) { CheckFailed("Range types must match instruction type!"
, &I); return; } } while (0)
;
2919
2920 APInt HighV = High->getValue();
2921 APInt LowV = Low->getValue();
2922 ConstantRange CurRange(LowV, HighV);
2923 Assert(!CurRange.isEmptySet() && !CurRange.isFullSet(),do { if (!(!CurRange.isEmptySet() && !CurRange.isFullSet
())) { CheckFailed("Range must not be empty!", Range); return
; } } while (0)
2924 "Range must not be empty!", Range)do { if (!(!CurRange.isEmptySet() && !CurRange.isFullSet
())) { CheckFailed("Range must not be empty!", Range); return
; } } while (0)
;
2925 if (i != 0) {
2926 Assert(CurRange.intersectWith(LastRange).isEmptySet(),do { if (!(CurRange.intersectWith(LastRange).isEmptySet())) {
CheckFailed("Intervals are overlapping", Range); return; } }
while (0)
2927 "Intervals are overlapping", Range)do { if (!(CurRange.intersectWith(LastRange).isEmptySet())) {
CheckFailed("Intervals are overlapping", Range); return; } }
while (0)
;
2928 Assert(LowV.sgt(LastRange.getLower()), "Intervals are not in order",do { if (!(LowV.sgt(LastRange.getLower()))) { CheckFailed("Intervals are not in order"
, Range); return; } } while (0)
2929 Range)do { if (!(LowV.sgt(LastRange.getLower()))) { CheckFailed("Intervals are not in order"
, Range); return; } } while (0)
;
2930 Assert(!isContiguous(CurRange, LastRange), "Intervals are contiguous",do { if (!(!isContiguous(CurRange, LastRange))) { CheckFailed
("Intervals are contiguous", Range); return; } } while (0)
2931 Range)do { if (!(!isContiguous(CurRange, LastRange))) { CheckFailed
("Intervals are contiguous", Range); return; } } while (0)
;
2932 }
2933 LastRange = ConstantRange(LowV, HighV);
2934 }
2935 if (NumRanges > 2) {
2936 APInt FirstLow =
2937 mdconst::dyn_extract<ConstantInt>(Range->getOperand(0))->getValue();
2938 APInt FirstHigh =
2939 mdconst::dyn_extract<ConstantInt>(Range->getOperand(1))->getValue();
2940 ConstantRange FirstRange(FirstLow, FirstHigh);
2941 Assert(FirstRange.intersectWith(LastRange).isEmptySet(),do { if (!(FirstRange.intersectWith(LastRange).isEmptySet()))
{ CheckFailed("Intervals are overlapping", Range); return; }
} while (0)
2942 "Intervals are overlapping", Range)do { if (!(FirstRange.intersectWith(LastRange).isEmptySet()))
{ CheckFailed("Intervals are overlapping", Range); return; }
} while (0)
;
2943 Assert(!isContiguous(FirstRange, LastRange), "Intervals are contiguous",do { if (!(!isContiguous(FirstRange, LastRange))) { CheckFailed
("Intervals are contiguous", Range); return; } } while (0)
2944 Range)do { if (!(!isContiguous(FirstRange, LastRange))) { CheckFailed
("Intervals are contiguous", Range); return; } } while (0)
;
2945 }
2946}
2947
2948void Verifier::checkAtomicMemAccessSize(const Module *M, Type *Ty,
2949 const Instruction *I) {
2950 unsigned Size = M->getDataLayout().getTypeSizeInBits(Ty);
2951 Assert(Size >= 8, "atomic memory access' size must be byte-sized", Ty, I)do { if (!(Size >= 8)) { CheckFailed("atomic memory access' size must be byte-sized"
, Ty, I); return; } } while (0)
;
2952 Assert(!(Size & (Size - 1)),do { if (!(!(Size & (Size - 1)))) { CheckFailed("atomic memory access' operand must have a power-of-two size"
, Ty, I); return; } } while (0)
2953 "atomic memory access' operand must have a power-of-two size", Ty, I)do { if (!(!(Size & (Size - 1)))) { CheckFailed("atomic memory access' operand must have a power-of-two size"
, Ty, I); return; } } while (0)
;
2954}
2955
2956void Verifier::visitLoadInst(LoadInst &LI) {
2957 PointerType *PTy = dyn_cast<PointerType>(LI.getOperand(0)->getType());
2958 Assert(PTy, "Load operand must be a pointer.", &LI)do { if (!(PTy)) { CheckFailed("Load operand must be a pointer."
, &LI); return; } } while (0)
;
2959 Type *ElTy = LI.getType();
2960 Assert(LI.getAlignment() <= Value::MaximumAlignment,do { if (!(LI.getAlignment() <= Value::MaximumAlignment)) {
CheckFailed("huge alignment values are unsupported", &LI
); return; } } while (0)
2961 "huge alignment values are unsupported", &LI)do { if (!(LI.getAlignment() <= Value::MaximumAlignment)) {
CheckFailed("huge alignment values are unsupported", &LI
); return; } } while (0)
;
2962 if (LI.isAtomic()) {
2963 Assert(LI.getOrdering() != AtomicOrdering::Release &&do { if (!(LI.getOrdering() != AtomicOrdering::Release &&
LI.getOrdering() != AtomicOrdering::AcquireRelease)) { CheckFailed
("Load cannot have Release ordering", &LI); return; } } while
(0)
2964 LI.getOrdering() != AtomicOrdering::AcquireRelease,do { if (!(LI.getOrdering() != AtomicOrdering::Release &&
LI.getOrdering() != AtomicOrdering::AcquireRelease)) { CheckFailed
("Load cannot have Release ordering", &LI); return; } } while
(0)
2965 "Load cannot have Release ordering", &LI)do { if (!(LI.getOrdering() != AtomicOrdering::Release &&
LI.getOrdering() != AtomicOrdering::AcquireRelease)) { CheckFailed
("Load cannot have Release ordering", &LI); return; } } while
(0)
;
2966 Assert(LI.getAlignment() != 0,do { if (!(LI.getAlignment() != 0)) { CheckFailed("Atomic load must specify explicit alignment"
, &LI); return; } } while (0)
2967 "Atomic load must specify explicit alignment", &LI)do { if (!(LI.getAlignment() != 0)) { CheckFailed("Atomic load must specify explicit alignment"
, &LI); return; } } while (0)
;
2968 Assert(ElTy->isIntegerTy() || ElTy->isPointerTy() ||do { if (!(ElTy->isIntegerTy() || ElTy->isPointerTy() ||
ElTy->isFloatingPointTy())) { CheckFailed("atomic load operand must have integer, pointer, or floating point "
"type!", ElTy, &LI); return; } } while (0)
2969 ElTy->isFloatingPointTy(),do { if (!(ElTy->isIntegerTy() || ElTy->isPointerTy() ||
ElTy->isFloatingPointTy())) { CheckFailed("atomic load operand must have integer, pointer, or floating point "
"type!", ElTy, &LI); return; } } while (0)
2970 "atomic load operand must have integer, pointer, or floating point "do { if (!(ElTy->isIntegerTy() || ElTy->isPointerTy() ||
ElTy->isFloatingPointTy())) { CheckFailed("atomic load operand must have integer, pointer, or floating point "
"type!", ElTy, &LI); return; } } while (0)
2971 "type!",do { if (!(ElTy->isIntegerTy() || ElTy->isPointerTy() ||
ElTy->isFloatingPointTy())) { CheckFailed("atomic load operand must have integer, pointer, or floating point "
"type!", ElTy, &LI); return; } } while (0)
2972 ElTy, &LI)do { if (!(ElTy->isIntegerTy() || ElTy->isPointerTy() ||
ElTy->isFloatingPointTy())) { CheckFailed("atomic load operand must have integer, pointer, or floating point "
"type!", ElTy, &LI); return; } } while (0)
;
2973 checkAtomicMemAccessSize(M, ElTy, &LI);
2974 } else {
2975 Assert(LI.getSynchScope() == CrossThread,do { if (!(LI.getSynchScope() == CrossThread)) { CheckFailed(
"Non-atomic load cannot have SynchronizationScope specified",
&LI); return; } } while (0)
2976 "Non-atomic load cannot have SynchronizationScope specified", &LI)do { if (!(LI.getSynchScope() == CrossThread)) { CheckFailed(
"Non-atomic load cannot have SynchronizationScope specified",
&LI); return; } } while (0)
;
2977 }
2978
2979 visitInstruction(LI);
2980}
2981
2982void Verifier::visitStoreInst(StoreInst &SI) {
2983 PointerType *PTy = dyn_cast<PointerType>(SI.getOperand(1)->getType());
2984 Assert(PTy, "Store operand must be a pointer.", &SI)do { if (!(PTy)) { CheckFailed("Store operand must be a pointer."
, &SI); return; } } while (0)
;
2985 Type *ElTy = PTy->getElementType();
2986 Assert(ElTy == SI.getOperand(0)->getType(),do { if (!(ElTy == SI.getOperand(0)->getType())) { CheckFailed
("Stored value type does not match pointer operand type!", &
SI, ElTy); return; } } while (0)
2987 "Stored value type does not match pointer operand type!", &SI, ElTy)do { if (!(ElTy == SI.getOperand(0)->getType())) { CheckFailed
("Stored value type does not match pointer operand type!", &
SI, ElTy); return; } } while (0)
;
2988 Assert(SI.getAlignment() <= Value::MaximumAlignment,do { if (!(SI.getAlignment() <= Value::MaximumAlignment)) {
CheckFailed("huge alignment values are unsupported", &SI
); return; } } while (0)
2989 "huge alignment values are unsupported", &SI)do { if (!(SI.getAlignment() <= Value::MaximumAlignment)) {
CheckFailed("huge alignment values are unsupported", &SI
); return; } } while (0)
;
2990 if (SI.isAtomic()) {
2991 Assert(SI.getOrdering() != AtomicOrdering::Acquire &&do { if (!(SI.getOrdering() != AtomicOrdering::Acquire &&
SI.getOrdering() != AtomicOrdering::AcquireRelease)) { CheckFailed
("Store cannot have Acquire ordering", &SI); return; } } while
(0)
2992 SI.getOrdering() != AtomicOrdering::AcquireRelease,do { if (!(SI.getOrdering() != AtomicOrdering::Acquire &&
SI.getOrdering() != AtomicOrdering::AcquireRelease)) { CheckFailed
("Store cannot have Acquire ordering", &SI); return; } } while
(0)
2993 "Store cannot have Acquire ordering", &SI)do { if (!(SI.getOrdering() != AtomicOrdering::Acquire &&
SI.getOrdering() != AtomicOrdering::AcquireRelease)) { CheckFailed
("Store cannot have Acquire ordering", &SI); return; } } while
(0)
;
2994 Assert(SI.getAlignment() != 0,do { if (!(SI.getAlignment() != 0)) { CheckFailed("Atomic store must specify explicit alignment"
, &SI); return; } } while (0)
2995 "Atomic store must specify explicit alignment", &SI)do { if (!(SI.getAlignment() != 0)) { CheckFailed("Atomic store must specify explicit alignment"
, &SI); return; } } while (0)
;
2996 Assert(ElTy->isIntegerTy() || ElTy->isPointerTy() ||do { if (!(ElTy->isIntegerTy() || ElTy->isPointerTy() ||
ElTy->isFloatingPointTy())) { CheckFailed("atomic store operand must have integer, pointer, or floating point "
"type!", ElTy, &SI); return; } } while (0)
2997 ElTy->isFloatingPointTy(),do { if (!(ElTy->isIntegerTy() || ElTy->isPointerTy() ||
ElTy->isFloatingPointTy())) { CheckFailed("atomic store operand must have integer, pointer, or floating point "
"type!", ElTy, &SI); return; } } while (0)
2998 "atomic store operand must have integer, pointer, or floating point "do { if (!(ElTy->isIntegerTy() || ElTy->isPointerTy() ||
ElTy->isFloatingPointTy())) { CheckFailed("atomic store operand must have integer, pointer, or floating point "
"type!", ElTy, &SI); return; } } while (0)
2999 "type!",do { if (!(ElTy->isIntegerTy() || ElTy->isPointerTy() ||
ElTy->isFloatingPointTy())) { CheckFailed("atomic store operand must have integer, pointer, or floating point "
"type!", ElTy, &SI); return; } } while (0)
3000 ElTy, &SI)do { if (!(ElTy->isIntegerTy() || ElTy->isPointerTy() ||
ElTy->isFloatingPointTy())) { CheckFailed("atomic store operand must have integer, pointer, or floating point "
"type!", ElTy, &SI); return; } } while (0)
;
3001 checkAtomicMemAccessSize(M, ElTy, &SI);
3002 } else {
3003 Assert(SI.getSynchScope() == CrossThread,do { if (!(SI.getSynchScope() == CrossThread)) { CheckFailed(
"Non-atomic store cannot have SynchronizationScope specified"
, &SI); return; } } while (0)
3004 "Non-atomic store cannot have SynchronizationScope specified", &SI)do { if (!(SI.getSynchScope() == CrossThread)) { CheckFailed(
"Non-atomic store cannot have SynchronizationScope specified"
, &SI); return; } } while (0)
;
3005 }
3006 visitInstruction(SI);
3007}
3008
3009/// Check that SwiftErrorVal is used as a swifterror argument in CS.
3010void Verifier::verifySwiftErrorCallSite(CallSite CS,
3011 const Value *SwiftErrorVal) {
3012 unsigned Idx = 0;
3013 for (CallSite::arg_iterator I = CS.arg_begin(), E = CS.arg_end();
3014 I != E; ++I, ++Idx) {
3015 if (*I == SwiftErrorVal) {
3016 Assert(CS.paramHasAttr(Idx+1, Attribute::SwiftError),do { if (!(CS.paramHasAttr(Idx+1, Attribute::SwiftError))) { CheckFailed
("swifterror value when used in a callsite should be marked "
"with swifterror attribute", SwiftErrorVal, CS); return; } }
while (0)
3017 "swifterror value when used in a callsite should be marked "do { if (!(CS.paramHasAttr(Idx+1, Attribute::SwiftError))) { CheckFailed
("swifterror value when used in a callsite should be marked "
"with swifterror attribute", SwiftErrorVal, CS); return; } }
while (0)
3018 "with swifterror attribute",do { if (!(CS.paramHasAttr(Idx+1, Attribute::SwiftError))) { CheckFailed
("swifterror value when used in a callsite should be marked "
"with swifterror attribute", SwiftErrorVal, CS); return; } }
while (0)
3019 SwiftErrorVal, CS)do { if (!(CS.paramHasAttr(Idx+1, Attribute::SwiftError))) { CheckFailed
("swifterror value when used in a callsite should be marked "
"with swifterror attribute", SwiftErrorVal, CS); return; } }
while (0)
;
3020 }
3021 }
3022}
3023
3024void Verifier::verifySwiftErrorValue(const Value *SwiftErrorVal) {
3025 // Check that swifterror value is only used by loads, stores, or as
3026 // a swifterror argument.
3027 for (const User *U : SwiftErrorVal->users()) {
3028 Assert(isa<LoadInst>(U) || isa<StoreInst>(U) || isa<CallInst>(U) ||do { if (!(isa<LoadInst>(U) || isa<StoreInst>(U) ||
isa<CallInst>(U) || isa<InvokeInst>(U))) { CheckFailed
("swifterror value can only be loaded and stored from, or " "as a swifterror argument!"
, SwiftErrorVal, U); return; } } while (0)
3029 isa<InvokeInst>(U),do { if (!(isa<LoadInst>(U) || isa<StoreInst>(U) ||
isa<CallInst>(U) || isa<InvokeInst>(U))) { CheckFailed
("swifterror value can only be loaded and stored from, or " "as a swifterror argument!"
, SwiftErrorVal, U); return; } } while (0)
3030 "swifterror value can only be loaded and stored from, or "do { if (!(isa<LoadInst>(U) || isa<StoreInst>(U) ||
isa<CallInst>(U) || isa<InvokeInst>(U))) { CheckFailed
("swifterror value can only be loaded and stored from, or " "as a swifterror argument!"
, SwiftErrorVal, U); return; } } while (0)
3031 "as a swifterror argument!",do { if (!(isa<LoadInst>(U) || isa<StoreInst>(U) ||
isa<CallInst>(U) || isa<InvokeInst>(U))) { CheckFailed
("swifterror value can only be loaded and stored from, or " "as a swifterror argument!"
, SwiftErrorVal, U); return; } } while (0)
3032 SwiftErrorVal, U)do { if (!(isa<LoadInst>(U) || isa<StoreInst>(U) ||
isa<CallInst>(U) || isa<InvokeInst>(U))) { CheckFailed
("swifterror value can only be loaded and stored from, or " "as a swifterror argument!"
, SwiftErrorVal, U); return; } } while (0)
;
3033 // If it is used by a store, check it is the second operand.
3034 if (auto StoreI = dyn_cast<StoreInst>(U))
3035 Assert(StoreI->getOperand(1) == SwiftErrorVal,do { if (!(StoreI->getOperand(1) == SwiftErrorVal)) { CheckFailed
("swifterror value should be the second operand when used " "by stores"
, SwiftErrorVal, U); return; } } while (0)
3036 "swifterror value should be the second operand when used "do { if (!(StoreI->getOperand(1) == SwiftErrorVal)) { CheckFailed
("swifterror value should be the second operand when used " "by stores"
, SwiftErrorVal, U); return; } } while (0)
3037 "by stores", SwiftErrorVal, U)do { if (!(StoreI->getOperand(1) == SwiftErrorVal)) { CheckFailed
("swifterror value should be the second operand when used " "by stores"
, SwiftErrorVal, U); return; } } while (0)
;
3038 if (auto CallI = dyn_cast<CallInst>(U))
3039 verifySwiftErrorCallSite(const_cast<CallInst*>(CallI), SwiftErrorVal);
3040 if (auto II = dyn_cast<InvokeInst>(U))
3041 verifySwiftErrorCallSite(const_cast<InvokeInst*>(II), SwiftErrorVal);
3042 }
3043}
3044
3045void Verifier::visitAllocaInst(AllocaInst &AI) {
3046 SmallPtrSet<Type*, 4> Visited;
3047 PointerType *PTy = AI.getType();
3048 Assert(PTy->getAddressSpace() == 0,do { if (!(PTy->getAddressSpace() == 0)) { CheckFailed("Allocation instruction pointer not in the generic address space!"
, &AI); return; } } while (0)
3049 "Allocation instruction pointer not in the generic address space!",do { if (!(PTy->getAddressSpace() == 0)) { CheckFailed("Allocation instruction pointer not in the generic address space!"
, &AI); return; } } while (0)
3050 &AI)do { if (!(PTy->getAddressSpace() == 0)) { CheckFailed("Allocation instruction pointer not in the generic address space!"
, &AI); return; } } while (0)
;
3051 Assert(AI.getAllocatedType()->isSized(&Visited),do { if (!(AI.getAllocatedType()->isSized(&Visited))) {
CheckFailed("Cannot allocate unsized type", &AI); return
; } } while (0)
3052 "Cannot allocate unsized type", &AI)do { if (!(AI.getAllocatedType()->isSized(&Visited))) {
CheckFailed("Cannot allocate unsized type", &AI); return
; } } while (0)
;
3053 Assert(AI.getArraySize()->getType()->isIntegerTy(),do { if (!(AI.getArraySize()->getType()->isIntegerTy())
) { CheckFailed("Alloca array size must have integer type", &
AI); return; } } while (0)
3054 "Alloca array size must have integer type", &AI)do { if (!(AI.getArraySize()->getType()->isIntegerTy())
) { CheckFailed("Alloca array size must have integer type", &
AI); return; } } while (0)
;
3055 Assert(AI.getAlignment() <= Value::MaximumAlignment,do { if (!(AI.getAlignment() <= Value::MaximumAlignment)) {
CheckFailed("huge alignment values are unsupported", &AI
); return; } } while (0)
3056 "huge alignment values are unsupported", &AI)do { if (!(AI.getAlignment() <= Value::MaximumAlignment)) {
CheckFailed("huge alignment values are unsupported", &AI
); return; } } while (0)
;
3057
3058 if (AI.isSwiftError()) {
3059 verifySwiftErrorValue(&AI);
3060 }
3061
3062 visitInstruction(AI);
3063}
3064
3065void Verifier::visitAtomicCmpXchgInst(AtomicCmpXchgInst &CXI) {
3066
3067 // FIXME: more conditions???
3068 Assert(CXI.getSuccessOrdering() != AtomicOrdering::NotAtomic,do { if (!(CXI.getSuccessOrdering() != AtomicOrdering::NotAtomic
)) { CheckFailed("cmpxchg instructions must be atomic.", &
CXI); return; } } while (0)
3069 "cmpxchg instructions must be atomic.", &CXI)do { if (!(CXI.getSuccessOrdering() != AtomicOrdering::NotAtomic
)) { CheckFailed("cmpxchg instructions must be atomic.", &
CXI); return; } } while (0)
;
3070 Assert(CXI.getFailureOrdering() != AtomicOrdering::NotAtomic,do { if (!(CXI.getFailureOrdering() != AtomicOrdering::NotAtomic
)) { CheckFailed("cmpxchg instructions must be atomic.", &
CXI); return; } } while (0)
3071 "cmpxchg instructions must be atomic.", &CXI)do { if (!(CXI.getFailureOrdering() != AtomicOrdering::NotAtomic
)) { CheckFailed("cmpxchg instructions must be atomic.", &
CXI); return; } } while (0)
;
3072 Assert(CXI.getSuccessOrdering() != AtomicOrdering::Unordered,do { if (!(CXI.getSuccessOrdering() != AtomicOrdering::Unordered
)) { CheckFailed("cmpxchg instructions cannot be unordered.",
&CXI); return; } } while (0)
3073 "cmpxchg instructions cannot be unordered.", &CXI)do { if (!(CXI.getSuccessOrdering() != AtomicOrdering::Unordered
)) { CheckFailed("cmpxchg instructions cannot be unordered.",
&CXI); return; } } while (0)
;
3074 Assert(CXI.getFailureOrdering() != AtomicOrdering::Unordered,do { if (!(CXI.getFailureOrdering() != AtomicOrdering::Unordered
)) { CheckFailed("cmpxchg instructions cannot be unordered.",
&CXI); return; } } while (0)
3075 "cmpxchg instructions cannot be unordered.", &CXI)do { if (!(CXI.getFailureOrdering() != AtomicOrdering::Unordered
)) { CheckFailed("cmpxchg instructions cannot be unordered.",
&CXI); return; } } while (0)
;
3076 Assert(!isStrongerThan(CXI.getFailureOrdering(), CXI.getSuccessOrdering()),do { if (!(!isStrongerThan(CXI.getFailureOrdering(), CXI.getSuccessOrdering
()))) { CheckFailed("cmpxchg instructions failure argument shall be no stronger than the "
"success argument", &CXI); return; } } while (0)
3077 "cmpxchg instructions failure argument shall be no stronger than the "do { if (!(!isStrongerThan(CXI.getFailureOrdering(), CXI.getSuccessOrdering
()))) { CheckFailed("cmpxchg instructions failure argument shall be no stronger than the "
"success argument", &CXI); return; } } while (0)
3078 "success argument",do { if (!(!isStrongerThan(CXI.getFailureOrdering(), CXI.getSuccessOrdering
()))) { CheckFailed("cmpxchg instructions failure argument shall be no stronger than the "
"success argument", &CXI); return; } } while (0)
3079 &CXI)do { if (!(!isStrongerThan(CXI.getFailureOrdering(), CXI.getSuccessOrdering
()))) { CheckFailed("cmpxchg instructions failure argument shall be no stronger than the "
"success argument", &CXI); return; } } while (0)
;
3080 Assert(CXI.getFailureOrdering() != AtomicOrdering::Release &&do { if (!(CXI.getFailureOrdering() != AtomicOrdering::Release
&& CXI.getFailureOrdering() != AtomicOrdering::AcquireRelease
)) { CheckFailed("cmpxchg failure ordering cannot include release semantics"
, &CXI); return; } } while (0)
3081 CXI.getFailureOrdering() != AtomicOrdering::AcquireRelease,do { if (!(CXI.getFailureOrdering() != AtomicOrdering::Release
&& CXI.getFailureOrdering() != AtomicOrdering::AcquireRelease
)) { CheckFailed("cmpxchg failure ordering cannot include release semantics"
, &CXI); return; } } while (0)
3082 "cmpxchg failure ordering cannot include release semantics", &CXI)do { if (!(CXI.getFailureOrdering() != AtomicOrdering::Release
&& CXI.getFailureOrdering() != AtomicOrdering::AcquireRelease
)) { CheckFailed("cmpxchg failure ordering cannot include release semantics"
, &CXI); return; } } while (0)
;
3083
3084 PointerType *PTy = dyn_cast<PointerType>(CXI.getOperand(0)->getType());
3085 Assert(PTy, "First cmpxchg operand must be a pointer.", &CXI)do { if (!(PTy)) { CheckFailed("First cmpxchg operand must be a pointer."
, &CXI); return; } } while (0)
;
3086 Type *ElTy = PTy->getElementType();
3087 Assert(ElTy->isIntegerTy() || ElTy->isPointerTy(),do { if (!(ElTy->isIntegerTy() || ElTy->isPointerTy()))
{ CheckFailed("cmpxchg operand must have integer or pointer type"
, ElTy, &CXI); return; } } while (0)
3088 "cmpxchg operand must have integer or pointer type",do { if (!(ElTy->isIntegerTy() || ElTy->isPointerTy()))
{ CheckFailed("cmpxchg operand must have integer or pointer type"
, ElTy, &CXI); return; } } while (0)
3089 ElTy, &CXI)do { if (!(ElTy->isIntegerTy() || ElTy->isPointerTy()))
{ CheckFailed("cmpxchg operand must have integer or pointer type"
, ElTy, &CXI); return; } } while (0)
;
3090 checkAtomicMemAccessSize(M, ElTy, &CXI);
3091 Assert(ElTy == CXI.getOperand(1)->getType(),do { if (!(ElTy == CXI.getOperand(1)->getType())) { CheckFailed
("Expected value type does not match pointer operand type!", &
CXI, ElTy); return; } } while (0)
3092 "Expected value type does not match pointer operand type!", &CXI,do { if (!(ElTy == CXI.getOperand(1)->getType())) { CheckFailed
("Expected value type does not match pointer operand type!", &
CXI, ElTy); return; } } while (0)
3093 ElTy)do { if (!(ElTy == CXI.getOperand(1)->getType())) { CheckFailed
("Expected value type does not match pointer operand type!", &
CXI, ElTy); return; } } while (0)
;
3094 Assert(ElTy == CXI.getOperand(2)->getType(),do { if (!(ElTy == CXI.getOperand(2)->getType())) { CheckFailed
("Stored value type does not match pointer operand type!", &
CXI, ElTy); return; } } while (0)
3095 "Stored value type does not match pointer operand type!", &CXI, ElTy)do { if (!(ElTy == CXI.getOperand(2)->getType())) { CheckFailed
("Stored value type does not match pointer operand type!", &
CXI, ElTy); return; } } while (0)
;
3096 visitInstruction(CXI);
3097}
3098
3099void Verifier::visitAtomicRMWInst(AtomicRMWInst &RMWI) {
3100 Assert(RMWI.getOrdering() != AtomicOrdering::NotAtomic,do { if (!(RMWI.getOrdering() != AtomicOrdering::NotAtomic)) {
CheckFailed("atomicrmw instructions must be atomic.", &RMWI
); return; } } while (0)
3101 "atomicrmw instructions must be atomic.", &RMWI)do { if (!(RMWI.getOrdering() != AtomicOrdering::NotAtomic)) {
CheckFailed("atomicrmw instructions must be atomic.", &RMWI
); return; } } while (0)
;
3102 Assert(RMWI.getOrdering() != AtomicOrdering::Unordered,do { if (!(RMWI.getOrdering() != AtomicOrdering::Unordered)) {
CheckFailed("atomicrmw instructions cannot be unordered.", &
RMWI); return; } } while (0)
3103 "atomicrmw instructions cannot be unordered.", &RMWI)do { if (!(RMWI.getOrdering() != AtomicOrdering::Unordered)) {
CheckFailed("atomicrmw instructions cannot be unordered.", &
RMWI); return; } } while (0)
;
3104 PointerType *PTy = dyn_cast<PointerType>(RMWI.getOperand(0)->getType());
3105 Assert(PTy, "First atomicrmw operand must be a pointer.", &RMWI)do { if (!(PTy)) { CheckFailed("First atomicrmw operand must be a pointer."
, &RMWI); return; } } while (0)
;
3106 Type *ElTy = PTy->getElementType();
3107 Assert(ElTy->isIntegerTy(), "atomicrmw operand must have integer type!",do { if (!(ElTy->isIntegerTy())) { CheckFailed("atomicrmw operand must have integer type!"
, &RMWI, ElTy); return; } } while (0)
3108 &RMWI, ElTy)do { if (!(ElTy->isIntegerTy())) { CheckFailed("atomicrmw operand must have integer type!"
, &RMWI, ElTy); return; } } while (0)
;
3109 checkAtomicMemAccessSize(M, ElTy, &RMWI);
3110 Assert(ElTy == RMWI.getOperand(1)->getType(),do { if (!(ElTy == RMWI.getOperand(1)->getType())) { CheckFailed
("Argument value type does not match pointer operand type!", &
RMWI, ElTy); return; } } while (0)
3111 "Argument value type does not match pointer operand type!", &RMWI,do { if (!(ElTy == RMWI.getOperand(1)->getType())) { CheckFailed
("Argument value type does not match pointer operand type!", &
RMWI, ElTy); return; } } while (0)
3112 ElTy)do { if (!(ElTy == RMWI.getOperand(1)->getType())) { CheckFailed
("Argument value type does not match pointer operand type!", &
RMWI, ElTy); return; } } while (0)
;
3113 Assert(AtomicRMWInst::FIRST_BINOP <= RMWI.getOperation() &&do { if (!(AtomicRMWInst::FIRST_BINOP <= RMWI.getOperation
() && RMWI.getOperation() <= AtomicRMWInst::LAST_BINOP
)) { CheckFailed("Invalid binary operation!", &RMWI); return
; } } while (0)
3114 RMWI.getOperation() <= AtomicRMWInst::LAST_BINOP,do { if (!(AtomicRMWInst::FIRST_BINOP <= RMWI.getOperation
() && RMWI.getOperation() <= AtomicRMWInst::LAST_BINOP
)) { CheckFailed("Invalid binary operation!", &RMWI); return
; } } while (0)
3115 "Invalid binary operation!", &RMWI)do { if (!(AtomicRMWInst::FIRST_BINOP <= RMWI.getOperation
() && RMWI.getOperation() <= AtomicRMWInst::LAST_BINOP
)) { CheckFailed("Invalid binary operation!", &RMWI); return
; } } while (0)
;
3116 visitInstruction(RMWI);
3117}
3118
3119void Verifier::visitFenceInst(FenceInst &FI) {
3120 const AtomicOrdering Ordering = FI.getOrdering();
3121 Assert(Ordering == AtomicOrdering::Acquire ||do { if (!(Ordering == AtomicOrdering::Acquire || Ordering ==
AtomicOrdering::Release || Ordering == AtomicOrdering::AcquireRelease
|| Ordering == AtomicOrdering::SequentiallyConsistent)) { CheckFailed
("fence instructions may only have acquire, release, acq_rel, or "
"seq_cst ordering.", &FI); return; } } while (0)
3122 Ordering == AtomicOrdering::Release ||do { if (!(Ordering == AtomicOrdering::Acquire || Ordering ==
AtomicOrdering::Release || Ordering == AtomicOrdering::AcquireRelease
|| Ordering == AtomicOrdering::SequentiallyConsistent)) { CheckFailed
("fence instructions may only have acquire, release, acq_rel, or "
"seq_cst ordering.", &FI); return; } } while (0)
3123 Ordering == AtomicOrdering::AcquireRelease ||do { if (!(Ordering == AtomicOrdering::Acquire || Ordering ==
AtomicOrdering::Release || Ordering == AtomicOrdering::AcquireRelease
|| Ordering == AtomicOrdering::SequentiallyConsistent)) { CheckFailed
("fence instructions may only have acquire, release, acq_rel, or "
"seq_cst ordering.", &FI); return; } } while (0)
3124 Ordering == AtomicOrdering::SequentiallyConsistent,do { if (!(Ordering == AtomicOrdering::Acquire || Ordering ==
AtomicOrdering::Release || Ordering == AtomicOrdering::AcquireRelease
|| Ordering == AtomicOrdering::SequentiallyConsistent)) { CheckFailed
("fence instructions may only have acquire, release, acq_rel, or "
"seq_cst ordering.", &FI); return; } } while (0)
3125 "fence instructions may only have acquire, release, acq_rel, or "do { if (!(Ordering == AtomicOrdering::Acquire || Ordering ==
AtomicOrdering::Release || Ordering == AtomicOrdering::AcquireRelease
|| Ordering == AtomicOrdering::SequentiallyConsistent)) { CheckFailed
("fence instructions may only have acquire, release, acq_rel, or "
"seq_cst ordering.", &FI); return; } } while (0)
3126 "seq_cst ordering.",do { if (!(Ordering == AtomicOrdering::Acquire || Ordering ==
AtomicOrdering::Release || Ordering == AtomicOrdering::AcquireRelease
|| Ordering == AtomicOrdering::SequentiallyConsistent)) { CheckFailed
("fence instructions may only have acquire, release, acq_rel, or "
"seq_cst ordering.", &FI); return; } } while (0)
3127 &FI)do { if (!(Ordering == AtomicOrdering::Acquire || Ordering ==
AtomicOrdering::Release || Ordering == AtomicOrdering::AcquireRelease
|| Ordering == AtomicOrdering::SequentiallyConsistent)) { CheckFailed
("fence instructions may only have acquire, release, acq_rel, or "
"seq_cst ordering.", &FI); return; } } while (0)
;
3128 visitInstruction(FI);
3129}
3130
3131void Verifier::visitExtractValueInst(ExtractValueInst &EVI) {
3132 Assert(ExtractValueInst::getIndexedType(EVI.getAggregateOperand()->getType(),do { if (!(ExtractValueInst::getIndexedType(EVI.getAggregateOperand
()->getType(), EVI.getIndices()) == EVI.getType())) { CheckFailed
("Invalid ExtractValueInst operands!", &EVI); return; } }
while (0)
3133 EVI.getIndices()) == EVI.getType(),do { if (!(ExtractValueInst::getIndexedType(EVI.getAggregateOperand
()->getType(), EVI.getIndices()) == EVI.getType())) { CheckFailed
("Invalid ExtractValueInst operands!", &EVI); return; } }
while (0)
3134 "Invalid ExtractValueInst operands!", &EVI)do { if (!(ExtractValueInst::getIndexedType(EVI.getAggregateOperand
()->getType(), EVI.getIndices()) == EVI.getType())) { CheckFailed
("Invalid ExtractValueInst operands!", &EVI); return; } }
while (0)
;
3135
3136 visitInstruction(EVI);
3137}
3138
3139void Verifier::visitInsertValueInst(InsertValueInst &IVI) {
3140 Assert(ExtractValueInst::getIndexedType(IVI.getAggregateOperand()->getType(),do { if (!(ExtractValueInst::getIndexedType(IVI.getAggregateOperand
()->getType(), IVI.getIndices()) == IVI.getOperand(1)->
getType())) { CheckFailed("Invalid InsertValueInst operands!"
, &IVI); return; } } while (0)
3141 IVI.getIndices()) ==do { if (!(ExtractValueInst::getIndexedType(IVI.getAggregateOperand
()->getType(), IVI.getIndices()) == IVI.getOperand(1)->
getType())) { CheckFailed("Invalid InsertValueInst operands!"
, &IVI); return; } } while (0)
3142 IVI.getOperand(1)->getType(),do { if (!(ExtractValueInst::getIndexedType(IVI.getAggregateOperand
()->getType(), IVI.getIndices()) == IVI.getOperand(1)->
getType())) { CheckFailed("Invalid InsertValueInst operands!"
, &IVI); return; } } while (0)
3143 "Invalid InsertValueInst operands!", &IVI)do { if (!(ExtractValueInst::getIndexedType(IVI.getAggregateOperand
()->getType(), IVI.getIndices()) == IVI.getOperand(1)->
getType())) { CheckFailed("Invalid InsertValueInst operands!"
, &IVI); return; } } while (0)
;
3144
3145 visitInstruction(IVI);
3146}
3147
3148static Value *getParentPad(Value *EHPad) {
3149 if (auto *FPI = dyn_cast<FuncletPadInst>(EHPad))
3150 return FPI->getParentPad();
3151
3152 return cast<CatchSwitchInst>(EHPad)->getParentPad();
3153}
3154
3155void Verifier::visitEHPadPredecessors(Instruction &I) {
3156 assert(I.isEHPad())((I.isEHPad()) ? static_cast<void> (0) : __assert_fail (
"I.isEHPad()", "/tmp/buildd/llvm-toolchain-snapshot-3.9~svn271203/lib/IR/Verifier.cpp"
, 3156, __PRETTY_FUNCTION__))
;
3157
3158 BasicBlock *BB = I.getParent();
3159 Function *F = BB->getParent();
3160
3161 Assert(BB != &F->getEntryBlock(), "EH pad cannot be in entry block.", &I)do { if (!(BB != &F->getEntryBlock())) { CheckFailed("EH pad cannot be in entry block."
, &I); return; } } while (0)
;
3162
3163 if (auto *LPI = dyn_cast<LandingPadInst>(&I)) {
3164 // The landingpad instruction defines its parent as a landing pad block. The
3165 // landing pad block may be branched to only by the unwind edge of an
3166 // invoke.
3167 for (BasicBlock *PredBB : predecessors(BB)) {
3168 const auto *II = dyn_cast<InvokeInst>(PredBB->getTerminator());
3169 Assert(II && II->getUnwindDest() == BB && II->getNormalDest() != BB,do { if (!(II && II->getUnwindDest() == BB &&
II->getNormalDest() != BB)) { CheckFailed("Block containing LandingPadInst must be jumped to "
"only by the unwind edge of an invoke.", LPI); return; } } while
(0)
3170 "Block containing LandingPadInst must be jumped to "do { if (!(II && II->getUnwindDest() == BB &&
II->getNormalDest() != BB)) { CheckFailed("Block containing LandingPadInst must be jumped to "
"only by the unwind edge of an invoke.", LPI); return; } } while
(0)
3171 "only by the unwind edge of an invoke.",do { if (!(II && II->getUnwindDest() == BB &&
II->getNormalDest() != BB)) { CheckFailed("Block containing LandingPadInst must be jumped to "
"only by the unwind edge of an invoke.", LPI); return; } } while
(0)
3172 LPI)do { if (!(II && II->getUnwindDest() == BB &&
II->getNormalDest() != BB)) { CheckFailed("Block containing LandingPadInst must be jumped to "
"only by the unwind edge of an invoke.", LPI); return; } } while
(0)
;
3173 }
3174 return;
3175 }
3176 if (auto *CPI = dyn_cast<CatchPadInst>(&I)) {
3177 if (!pred_empty(BB))
3178 Assert(BB->getUniquePredecessor() == CPI->getCatchSwitch()->getParent(),do { if (!(BB->getUniquePredecessor() == CPI->getCatchSwitch
()->getParent())) { CheckFailed("Block containg CatchPadInst must be jumped to "
"only by its catchswitch.", CPI); return; } } while (0)
3179 "Block containg CatchPadInst must be jumped to "do { if (!(BB->getUniquePredecessor() == CPI->getCatchSwitch
()->getParent())) { CheckFailed("Block containg CatchPadInst must be jumped to "
"only by its catchswitch.", CPI); return; } } while (0)
3180 "only by its catchswitch.",do { if (!(BB->getUniquePredecessor() == CPI->getCatchSwitch
()->getParent())) { CheckFailed("Block containg CatchPadInst must be jumped to "
"only by its catchswitch.", CPI); return; } } while (0)
3181 CPI)do { if (!(BB->getUniquePredecessor() == CPI->getCatchSwitch
()->getParent())) { CheckFailed("Block containg CatchPadInst must be jumped to "
"only by its catchswitch.", CPI); return; } } while (0)
;
3182 Assert(BB != CPI->getCatchSwitch()->getUnwindDest(),do { if (!(BB != CPI->getCatchSwitch()->getUnwindDest()
)) { CheckFailed("Catchswitch cannot unwind to one of its catchpads"
, CPI->getCatchSwitch(), CPI); return; } } while (0)
3183 "Catchswitch cannot unwind to one of its catchpads",do { if (!(BB != CPI->getCatchSwitch()->getUnwindDest()
)) { CheckFailed("Catchswitch cannot unwind to one of its catchpads"
, CPI->getCatchSwitch(), CPI); return; } } while (0)
3184 CPI->getCatchSwitch(), CPI)do { if (!(BB != CPI->getCatchSwitch()->getUnwindDest()
)) { CheckFailed("Catchswitch cannot unwind to one of its catchpads"
, CPI->getCatchSwitch(), CPI); return; } } while (0)
;
3185 return;
3186 }
3187
3188 // Verify that each pred has a legal terminator with a legal to/from EH
3189 // pad relationship.
3190 Instruction *ToPad = &I;
3191 Value *ToPadParent = getParentPad(ToPad);
3192 for (BasicBlock *PredBB : predecessors(BB)) {
3193 TerminatorInst *TI = PredBB->getTerminator();
3194 Value *FromPad;
3195 if (auto *II = dyn_cast<InvokeInst>(TI)) {
3196 Assert(II->getUnwindDest() == BB && II->getNormalDest() != BB,do { if (!(II->getUnwindDest() == BB && II->getNormalDest
() != BB)) { CheckFailed("EH pad must be jumped to via an unwind edge"
, ToPad, II); return; } } while (0)
3197 "EH pad must be jumped to via an unwind edge", ToPad, II)do { if (!(II->getUnwindDest() == BB && II->getNormalDest
() != BB)) { CheckFailed("EH pad must be jumped to via an unwind edge"
, ToPad, II); return; } } while (0)
;
3198 if (auto Bundle = II->getOperandBundle(LLVMContext::OB_funclet))
3199 FromPad = Bundle->Inputs[0];
3200 else
3201 FromPad = ConstantTokenNone::get(II->getContext());
3202 } else if (auto *CRI = dyn_cast<CleanupReturnInst>(TI)) {
3203 FromPad = CRI->getOperand(0);
3204 Assert(FromPad != ToPadParent, "A cleanupret must exit its cleanup", CRI)do { if (!(FromPad != ToPadParent)) { CheckFailed("A cleanupret must exit its cleanup"
, CRI); return; } } while (0)
;
3205 } else if (auto *CSI = dyn_cast<CatchSwitchInst>(TI)) {
3206 FromPad = CSI;
3207 } else {
3208 Assert(false, "EH pad must be jumped to via an unwind edge", ToPad, TI)do { if (!(false)) { CheckFailed("EH pad must be jumped to via an unwind edge"
, ToPad, TI); return; } } while (0)
;
3209 }
3210
3211 // The edge may exit from zero or more nested pads.
3212 SmallSet<Value *, 8> Seen;
3213 for (;; FromPad = getParentPad(FromPad)) {
3214 Assert(FromPad != ToPad,do { if (!(FromPad != ToPad)) { CheckFailed("EH pad cannot handle exceptions raised within it"
, FromPad, TI); return; } } while (0)
3215 "EH pad cannot handle exceptions raised within it", FromPad, TI)do { if (!(FromPad != ToPad)) { CheckFailed("EH pad cannot handle exceptions raised within it"
, FromPad, TI); return; } } while (0)
;
3216 if (FromPad == ToPadParent) {
3217 // This is a legal unwind edge.
3218 break;
3219 }
3220 Assert(!isa<ConstantTokenNone>(FromPad),do { if (!(!isa<ConstantTokenNone>(FromPad))) { CheckFailed
("A single unwind edge may only enter one EH pad", TI); return
; } } while (0)
3221 "A single unwind edge may only enter one EH pad", TI)do { if (!(!isa<ConstantTokenNone>(FromPad))) { CheckFailed
("A single unwind edge may only enter one EH pad", TI); return
; } } while (0)
;
3222 Assert(Seen.insert(FromPad).second,do { if (!(Seen.insert(FromPad).second)) { CheckFailed("EH pad jumps through a cycle of pads"
, FromPad); return; } } while (0)
3223 "EH pad jumps through a cycle of pads", FromPad)do { if (!(Seen.insert(FromPad).second)) { CheckFailed("EH pad jumps through a cycle of pads"
, FromPad); return; } } while (0)
;
3224 }
3225 }
3226}
3227
3228void Verifier::visitLandingPadInst(LandingPadInst &LPI) {
3229 // The landingpad instruction is ill-formed if it doesn't have any clauses and
3230 // isn't a cleanup.
3231 Assert(LPI.getNumClauses() > 0 || LPI.isCleanup(),do { if (!(LPI.getNumClauses() > 0 || LPI.isCleanup())) { CheckFailed
("LandingPadInst needs at least one clause or to be a cleanup."
, &LPI); return; } } while (0)
3232 "LandingPadInst needs at least one clause or to be a cleanup.", &LPI)do { if (!(LPI.getNumClauses() > 0 || LPI.isCleanup())) { CheckFailed
("LandingPadInst needs at least one clause or to be a cleanup."
, &LPI); return; } } while (0)
;
3233
3234 visitEHPadPredecessors(LPI);
3235
3236 if (!LandingPadResultTy)
3237 LandingPadResultTy = LPI.getType();
3238 else
3239 Assert(LandingPadResultTy == LPI.getType(),do { if (!(LandingPadResultTy == LPI.getType())) { CheckFailed
("The landingpad instruction should have a consistent result type "
"inside a function.", &LPI); return; } } while (0)
3240 "The landingpad instruction should have a consistent result type "do { if (!(LandingPadResultTy == LPI.getType())) { CheckFailed
("The landingpad instruction should have a consistent result type "
"inside a function.", &LPI); return; } } while (0)
3241 "inside a function.",do { if (!(LandingPadResultTy == LPI.getType())) { CheckFailed
("The landingpad instruction should have a consistent result type "
"inside a function.", &LPI); return; } } while (0)
3242 &LPI)do { if (!(LandingPadResultTy == LPI.getType())) { CheckFailed
("The landingpad instruction should have a consistent result type "
"inside a function.", &LPI); return; } } while (0)
;
3243
3244 Function *F = LPI.getParent()->getParent();
3245 Assert(F->hasPersonalityFn(),do { if (!(F->hasPersonalityFn())) { CheckFailed("LandingPadInst needs to be in a function with a personality."
, &LPI); return; } } while (0)
3246 "LandingPadInst needs to be in a function with a personality.", &LPI)do { if (!(F->hasPersonalityFn())) { CheckFailed("LandingPadInst needs to be in a function with a personality."
, &LPI); return; } } while (0)
;
3247
3248 // The landingpad instruction must be the first non-PHI instruction in the
3249 // block.
3250 Assert(LPI.getParent()->getLandingPadInst() == &LPI,do { if (!(LPI.getParent()->getLandingPadInst() == &LPI
)) { CheckFailed("LandingPadInst not the first non-PHI instruction in the block."
, &LPI); return; } } while (0)
3251 "LandingPadInst not the first non-PHI instruction in the block.",do { if (!(LPI.getParent()->getLandingPadInst() == &LPI
)) { CheckFailed("LandingPadInst not the first non-PHI instruction in the block."
, &LPI); return; } } while (0)
3252 &LPI)do { if (!(LPI.getParent()->getLandingPadInst() == &LPI
)) { CheckFailed("LandingPadInst not the first non-PHI instruction in the block."
, &LPI); return; } } while (0)
;
3253
3254 for (unsigned i = 0, e = LPI.getNumClauses(); i < e; ++i) {
3255 Constant *Clause = LPI.getClause(i);
3256 if (LPI.isCatch(i)) {
3257 Assert(isa<PointerType>(Clause->getType()),do { if (!(isa<PointerType>(Clause->getType()))) { CheckFailed
("Catch operand does not have pointer type!", &LPI); return
; } } while (0)
3258 "Catch operand does not have pointer type!", &LPI)do { if (!(isa<PointerType>(Clause->getType()))) { CheckFailed
("Catch operand does not have pointer type!", &LPI); return
; } } while (0)
;
3259 } else {
3260 Assert(LPI.isFilter(i), "Clause is neither catch nor filter!", &LPI)do { if (!(LPI.isFilter(i))) { CheckFailed("Clause is neither catch nor filter!"
, &LPI); return; } } while (0)
;
3261 Assert(isa<ConstantArray>(Clause) || isa<ConstantAggregateZero>(Clause),do { if (!(isa<ConstantArray>(Clause) || isa<ConstantAggregateZero
>(Clause))) { CheckFailed("Filter operand is not an array of constants!"
, &LPI); return; } } while (0)
3262 "Filter operand is not an array of constants!", &LPI)do { if (!(isa<ConstantArray>(Clause) || isa<ConstantAggregateZero
>(Clause))) { CheckFailed("Filter operand is not an array of constants!"
, &LPI); return; } } while (0)
;
3263 }
3264 }
3265
3266 visitInstruction(LPI);
3267}
3268
3269void Verifier::visitCatchPadInst(CatchPadInst &CPI) {
3270 BasicBlock *BB = CPI.getParent();
3271
3272 Function *F = BB->getParent();
3273 Assert(F->hasPersonalityFn(),do { if (!(F->hasPersonalityFn())) { CheckFailed("CatchPadInst needs to be in a function with a personality."
, &CPI); return; } } while (0)
3274 "CatchPadInst needs to be in a function with a personality.", &CPI)do { if (!(F->hasPersonalityFn())) { CheckFailed("CatchPadInst needs to be in a function with a personality."
, &CPI); return; } } while (0)
;
3275
3276 Assert(isa<CatchSwitchInst>(CPI.getParentPad()),do { if (!(isa<CatchSwitchInst>(CPI.getParentPad()))) {
CheckFailed("CatchPadInst needs to be directly nested in a CatchSwitchInst."
, CPI.getParentPad()); return; } } while (0)
3277 "CatchPadInst needs to be directly nested in a CatchSwitchInst.",do { if (!(isa<CatchSwitchInst>(CPI.getParentPad()))) {
CheckFailed("CatchPadInst needs to be directly nested in a CatchSwitchInst."
, CPI.getParentPad()); return; } } while (0)
3278 CPI.getParentPad())do { if (!(isa<CatchSwitchInst>(CPI.getParentPad()))) {
CheckFailed("CatchPadInst needs to be directly nested in a CatchSwitchInst."
, CPI.getParentPad()); return; } } while (0)
;
3279
3280 // The catchpad instruction must be the first non-PHI instruction in the
3281 // block.
3282 Assert(BB->getFirstNonPHI() == &CPI,do { if (!(BB->getFirstNonPHI() == &CPI)) { CheckFailed
("CatchPadInst not the first non-PHI instruction in the block."
, &CPI); return; } } while (0)
3283 "CatchPadInst not the first non-PHI instruction in the block.", &CPI)do { if (!(BB->getFirstNonPHI() == &CPI)) { CheckFailed
("CatchPadInst not the first non-PHI instruction in the block."
, &CPI); return; } } while (0)
;
3284
3285 visitEHPadPredecessors(CPI);
3286 visitFuncletPadInst(CPI);
3287}
3288
3289void Verifier::visitCatchReturnInst(CatchReturnInst &CatchReturn) {
3290 Assert(isa<CatchPadInst>(CatchReturn.getOperand(0)),do { if (!(isa<CatchPadInst>(CatchReturn.getOperand(0))
)) { CheckFailed("CatchReturnInst needs to be provided a CatchPad"
, &CatchReturn, CatchReturn.getOperand(0)); return; } } while
(0)
3291 "CatchReturnInst needs to be provided a CatchPad", &CatchReturn,do { if (!(isa<CatchPadInst>(CatchReturn.getOperand(0))
)) { CheckFailed("CatchReturnInst needs to be provided a CatchPad"
, &CatchReturn, CatchReturn.getOperand(0)); return; } } while
(0)
3292 CatchReturn.getOperand(0))do { if (!(isa<CatchPadInst>(CatchReturn.getOperand(0))
)) { CheckFailed("CatchReturnInst needs to be provided a CatchPad"
, &CatchReturn, CatchReturn.getOperand(0)); return; } } while
(0)
;
3293
3294 visitTerminatorInst(CatchReturn);
3295}
3296
3297void Verifier::visitCleanupPadInst(CleanupPadInst &CPI) {
3298 BasicBlock *BB = CPI.getParent();
3299
3300 Function *F = BB->getParent();
3301 Assert(F->hasPersonalityFn(),do { if (!(F->hasPersonalityFn())) { CheckFailed("CleanupPadInst needs to be in a function with a personality."
, &CPI); return; } } while (0)
3302 "CleanupPadInst needs to be in a function with a personality.", &CPI)do { if (!(F->hasPersonalityFn())) { CheckFailed("CleanupPadInst needs to be in a function with a personality."
, &CPI); return; } } while (0)
;
3303
3304 // The cleanuppad instruction must be the first non-PHI instruction in the
3305 // block.
3306 Assert(BB->getFirstNonPHI() == &CPI,do { if (!(BB->getFirstNonPHI() == &CPI)) { CheckFailed
("CleanupPadInst not the first non-PHI instruction in the block."
, &CPI); return; } } while (0)
3307 "CleanupPadInst not the first non-PHI instruction in the block.",do { if (!(BB->getFirstNonPHI() == &CPI)) { CheckFailed
("CleanupPadInst not the first non-PHI instruction in the block."
, &CPI); return; } } while (0)
3308 &CPI)do { if (!(BB->getFirstNonPHI() == &CPI)) { CheckFailed
("CleanupPadInst not the first non-PHI instruction in the block."
, &CPI); return; } } while (0)
;
3309
3310 auto *ParentPad = CPI.getParentPad();
3311 Assert(isa<ConstantTokenNone>(ParentPad) || isa<FuncletPadInst>(ParentPad),do { if (!(isa<ConstantTokenNone>(ParentPad) || isa<
FuncletPadInst>(ParentPad))) { CheckFailed("CleanupPadInst has an invalid parent."
, &CPI); return; } } while (0)
3312 "CleanupPadInst has an invalid parent.", &CPI)do { if (!(isa<ConstantTokenNone>(ParentPad) || isa<
FuncletPadInst>(ParentPad))) { CheckFailed("CleanupPadInst has an invalid parent."
, &CPI); return; } } while (0)
;
3313
3314 visitEHPadPredecessors(CPI);
3315 visitFuncletPadInst(CPI);
3316}
3317
3318void Verifier::visitFuncletPadInst(FuncletPadInst &FPI) {
3319 User *FirstUser = nullptr;
3320 Value *FirstUnwindPad = nullptr;
3321 SmallVector<FuncletPadInst *, 8> Worklist({&FPI});
3322 SmallSet<FuncletPadInst *, 8> Seen;
3323
3324 while (!Worklist.empty()) {
3325 FuncletPadInst *CurrentPad = Worklist.pop_back_val();
3326 Assert(Seen.insert(CurrentPad).second,do { if (!(Seen.insert(CurrentPad).second)) { CheckFailed("FuncletPadInst must not be nested within itself"
, CurrentPad); return; } } while (0)
3327 "FuncletPadInst must not be nested within itself", CurrentPad)do { if (!(Seen.insert(CurrentPad).second)) { CheckFailed("FuncletPadInst must not be nested within itself"
, CurrentPad); return; } } while (0)
;
3328 Value *UnresolvedAncestorPad = nullptr;
3329 for (User *U : CurrentPad->users()) {
3330 BasicBlock *UnwindDest;
3331 if (auto *CRI = dyn_cast<CleanupReturnInst>(U)) {
3332 UnwindDest = CRI->getUnwindDest();
3333 } else if (auto *CSI = dyn_cast<CatchSwitchInst>(U)) {
3334 // We allow catchswitch unwind to caller to nest
3335 // within an outer pad that unwinds somewhere else,
3336 // because catchswitch doesn't have a nounwind variant.
3337 // See e.g. SimplifyCFGOpt::SimplifyUnreachable.
3338 if (CSI->unwindsToCaller())
3339 continue;
3340 UnwindDest = CSI->getUnwindDest();
3341 } else if (auto *II = dyn_cast<InvokeInst>(U)) {
3342 UnwindDest = II->getUnwindDest();
3343 } else if (isa<CallInst>(U)) {
3344 // Calls which don't unwind may be found inside funclet
3345 // pads that unwind somewhere else. We don't *require*
3346 // such calls to be annotated nounwind.
3347 continue;
3348 } else if (auto *CPI = dyn_cast<CleanupPadInst>(U)) {
3349 // The unwind dest for a cleanup can only be found by
3350 // recursive search. Add it to the worklist, and we'll
3351 // search for its first use that determines where it unwinds.
3352 Worklist.push_back(CPI);
3353 continue;
3354 } else {
3355 Assert(isa<CatchReturnInst>(U), "Bogus funclet pad use", U)do { if (!(isa<CatchReturnInst>(U))) { CheckFailed("Bogus funclet pad use"
, U); return; } } while (0)
;
3356 continue;
3357 }
3358
3359 Value *UnwindPad;
3360 bool ExitsFPI;
3361 if (UnwindDest) {
3362 UnwindPad = UnwindDest->getFirstNonPHI();
3363 if (!cast<Instruction>(UnwindPad)->isEHPad())
3364 continue;
3365 Value *UnwindParent = getParentPad(UnwindPad);
3366 // Ignore unwind edges that don't exit CurrentPad.
3367 if (UnwindParent == CurrentPad)
3368 continue;
3369 // Determine whether the original funclet pad is exited,
3370 // and if we are scanning nested pads determine how many
3371 // of them are exited so we can stop searching their
3372 // children.
3373 Value *ExitedPad = CurrentPad;
3374 ExitsFPI = false;
3375 do {
3376 if (ExitedPad == &FPI) {
3377 ExitsFPI = true;
3378 // Now we can resolve any ancestors of CurrentPad up to
3379 // FPI, but not including FPI since we need to make sure
3380 // to check all direct users of FPI for consistency.
3381 UnresolvedAncestorPad = &FPI;
3382 break;
3383 }
3384 Value *ExitedParent = getParentPad(ExitedPad);
3385 if (ExitedParent == UnwindParent) {
3386 // ExitedPad is the ancestor-most pad which this unwind
3387 // edge exits, so we can resolve up to it, meaning that
3388 // ExitedParent is the first ancestor still unresolved.
3389 UnresolvedAncestorPad = ExitedParent;
3390 break;
3391 }
3392 ExitedPad = ExitedParent;
3393 } while (!isa<ConstantTokenNone>(ExitedPad));
3394 } else {
3395 // Unwinding to caller exits all pads.
3396 UnwindPad = ConstantTokenNone::get(FPI.getContext());
3397 ExitsFPI = true;
3398 UnresolvedAncestorPad = &FPI;
3399 }
3400
3401 if (ExitsFPI) {
3402 // This unwind edge exits FPI. Make sure it agrees with other
3403 // such edges.
3404 if (FirstUser) {
3405 Assert(UnwindPad == FirstUnwindPad, "Unwind edges out of a funclet "do { if (!(UnwindPad == FirstUnwindPad)) { CheckFailed("Unwind edges out of a funclet "
"pad must have the same unwind " "dest", &FPI, U, FirstUser
); return; } } while (0)
3406 "pad must have the same unwind "do { if (!(UnwindPad == FirstUnwindPad)) { CheckFailed("Unwind edges out of a funclet "
"pad must have the same unwind " "dest", &FPI, U, FirstUser
); return; } } while (0)
3407 "dest",do { if (!(UnwindPad == FirstUnwindPad)) { CheckFailed("Unwind edges out of a funclet "
"pad must have the same unwind " "dest", &FPI, U, FirstUser
); return; } } while (0)
3408 &FPI, U, FirstUser)do { if (!(UnwindPad == FirstUnwindPad)) { CheckFailed("Unwind edges out of a funclet "
"pad must have the same unwind " "dest", &FPI, U, FirstUser
); return; } } while (0)
;
3409 } else {
3410 FirstUser = U;
3411 FirstUnwindPad = UnwindPad;
3412 // Record cleanup sibling unwinds for verifySiblingFuncletUnwinds
3413 if (isa<CleanupPadInst>(&FPI) && !isa<ConstantTokenNone>(UnwindPad) &&
3414 getParentPad(UnwindPad) == getParentPad(&FPI))
3415 SiblingFuncletInfo[&FPI] = cast<TerminatorInst>(U);
3416 }
3417 }
3418 // Make sure we visit all uses of FPI, but for nested pads stop as
3419 // soon as we know where they unwind to.
3420 if (CurrentPad != &FPI)
3421 break;
3422 }
3423 if (UnresolvedAncestorPad) {
3424 if (CurrentPad == UnresolvedAncestorPad) {
3425 // When CurrentPad is FPI itself, we don't mark it as resolved even if
3426 // we've found an unwind edge that exits it, because we need to verify
3427 // all direct uses of FPI.
3428 assert(CurrentPad == &FPI)((CurrentPad == &FPI) ? static_cast<void> (0) : __assert_fail
("CurrentPad == &FPI", "/tmp/buildd/llvm-toolchain-snapshot-3.9~svn271203/lib/IR/Verifier.cpp"
, 3428, __PRETTY_FUNCTION__))
;
3429 continue;
3430 }
3431 // Pop off the worklist any nested pads that we've found an unwind
3432 // destination for. The pads on the worklist are the uncles,
3433 // great-uncles, etc. of CurrentPad. We've found an unwind destination
3434 // for all ancestors of CurrentPad up to but not including
3435 // UnresolvedAncestorPad.
3436 Value *ResolvedPad = CurrentPad;
3437 while (!Worklist.empty()) {
3438 Value *UnclePad = Worklist.back();
3439 Value *AncestorPad = getParentPad(UnclePad);
3440 // Walk ResolvedPad up the ancestor list until we either find the
3441 // uncle's parent or the last resolved ancestor.
3442 while (ResolvedPad != AncestorPad) {
3443 Value *ResolvedParent = getParentPad(ResolvedPad);
3444 if (ResolvedParent == UnresolvedAncestorPad) {
3445 break;
3446 }
3447 ResolvedPad = ResolvedParent;
3448 }
3449 // If the resolved ancestor search didn't find the uncle's parent,
3450 // then the uncle is not yet resolved.
3451 if (ResolvedPad != AncestorPad)
3452 break;
3453 // This uncle is resolved, so pop it from the worklist.
3454 Worklist.pop_back();
3455 }
3456 }
3457 }
3458
3459 if (FirstUnwindPad) {
3460 if (auto *CatchSwitch = dyn_cast<CatchSwitchInst>(FPI.getParentPad())) {
3461 BasicBlock *SwitchUnwindDest = CatchSwitch->getUnwindDest();
3462 Value *SwitchUnwindPad;
3463 if (SwitchUnwindDest)
3464 SwitchUnwindPad = SwitchUnwindDest->getFirstNonPHI();
3465 else
3466 SwitchUnwindPad = ConstantTokenNone::get(FPI.getContext());
3467 Assert(SwitchUnwindPad == FirstUnwindPad,do { if (!(SwitchUnwindPad == FirstUnwindPad)) { CheckFailed(
"Unwind edges out of a catch must have the same unwind dest as "
"the parent catchswitch", &FPI, FirstUser, CatchSwitch);
return; } } while (0)
3468 "Unwind edges out of a catch must have the same unwind dest as "do { if (!(SwitchUnwindPad == FirstUnwindPad)) { CheckFailed(
"Unwind edges out of a catch must have the same unwind dest as "
"the parent catchswitch", &FPI, FirstUser, CatchSwitch);
return; } } while (0)
3469 "the parent catchswitch",do { if (!(SwitchUnwindPad == FirstUnwindPad)) { CheckFailed(
"Unwind edges out of a catch must have the same unwind dest as "
"the parent catchswitch", &FPI, FirstUser, CatchSwitch);
return; } } while (0)
3470 &FPI, FirstUser, CatchSwitch)do { if (!(SwitchUnwindPad == FirstUnwindPad)) { CheckFailed(
"Unwind edges out of a catch must have the same unwind dest as "
"the parent catchswitch", &FPI, FirstUser, CatchSwitch);
return; } } while (0)
;
3471 }
3472 }
3473
3474 visitInstruction(FPI);
3475}
3476
3477void Verifier::visitCatchSwitchInst(CatchSwitchInst &CatchSwitch) {
3478 BasicBlock *BB = CatchSwitch.getParent();
3479
3480 Function *F = BB->getParent();
3481 Assert(F->hasPersonalityFn(),do { if (!(F->hasPersonalityFn())) { CheckFailed("CatchSwitchInst needs to be in a function with a personality."
, &CatchSwitch); return; } } while (0)
3482 "CatchSwitchInst needs to be in a function with a personality.",do { if (!(F->hasPersonalityFn())) { CheckFailed("CatchSwitchInst needs to be in a function with a personality."
, &CatchSwitch); return; } } while (0)
3483 &CatchSwitch)do { if (!(F->hasPersonalityFn())) { CheckFailed("CatchSwitchInst needs to be in a function with a personality."
, &CatchSwitch); return; } } while (0)
;
3484
3485 // The catchswitch instruction must be the first non-PHI instruction in the
3486 // block.
3487 Assert(BB->getFirstNonPHI() == &CatchSwitch,do { if (!(BB->getFirstNonPHI() == &CatchSwitch)) { CheckFailed
("CatchSwitchInst not the first non-PHI instruction in the block."
, &CatchSwitch); return; } } while (0)
3488 "CatchSwitchInst not the first non-PHI instruction in the block.",do { if (!(BB->getFirstNonPHI() == &CatchSwitch)) { CheckFailed
("CatchSwitchInst not the first non-PHI instruction in the block."
, &CatchSwitch); return; } } while (0)
3489 &CatchSwitch)do { if (!(BB->getFirstNonPHI() == &CatchSwitch)) { CheckFailed
("CatchSwitchInst not the first non-PHI instruction in the block."
, &CatchSwitch); return; } } while (0)
;
3490
3491 auto *ParentPad = CatchSwitch.getParentPad();
3492 Assert(isa<ConstantTokenNone>(ParentPad) || isa<FuncletPadInst>(ParentPad),do { if (!(isa<ConstantTokenNone>(ParentPad) || isa<
FuncletPadInst>(ParentPad))) { CheckFailed("CatchSwitchInst has an invalid parent."
, ParentPad); return; } } while (0)
3493 "CatchSwitchInst has an invalid parent.", ParentPad)do { if (!(isa<ConstantTokenNone>(ParentPad) || isa<
FuncletPadInst>(ParentPad))) { CheckFailed("CatchSwitchInst has an invalid parent."
, ParentPad); return; } } while (0)
;
3494
3495 if (BasicBlock *UnwindDest = CatchSwitch.getUnwindDest()) {
3496 Instruction *I = UnwindDest->getFirstNonPHI();
3497 Assert(I->isEHPad() && !isa<LandingPadInst>(I),do { if (!(I->isEHPad() && !isa<LandingPadInst>
(I))) { CheckFailed("CatchSwitchInst must unwind to an EH block which is not a "
"landingpad.", &CatchSwitch); return; } } while (0)
3498 "CatchSwitchInst must unwind to an EH block which is not a "do { if (!(I->isEHPad() && !isa<LandingPadInst>
(I))) { CheckFailed("CatchSwitchInst must unwind to an EH block which is not a "
"landingpad.", &CatchSwitch); return; } } while (0)
3499 "landingpad.",do { if (!(I->isEHPad() && !isa<LandingPadInst>
(I))) { CheckFailed("CatchSwitchInst must unwind to an EH block which is not a "
"landingpad.", &CatchSwitch); return; } } while (0)
3500 &CatchSwitch)do { if (!(I->isEHPad() && !isa<LandingPadInst>
(I))) { CheckFailed("CatchSwitchInst must unwind to an EH block which is not a "
"landingpad.", &CatchSwitch); return; } } while (0)
;
3501
3502 // Record catchswitch sibling unwinds for verifySiblingFuncletUnwinds
3503 if (getParentPad(I) == ParentPad)
3504 SiblingFuncletInfo[&CatchSwitch] = &CatchSwitch;
3505 }
3506
3507 Assert(CatchSwitch.getNumHandlers() != 0,do { if (!(CatchSwitch.getNumHandlers() != 0)) { CheckFailed(
"CatchSwitchInst cannot have empty handler list", &CatchSwitch
); return; } } while (0)
3508 "CatchSwitchInst cannot have empty handler list", &CatchSwitch)do { if (!(CatchSwitch.getNumHandlers() != 0)) { CheckFailed(
"CatchSwitchInst cannot have empty handler list", &CatchSwitch
); return; } } while (0)
;
3509
3510 for (BasicBlock *Handler : CatchSwitch.handlers()) {
3511 Assert(isa<CatchPadInst>(Handler->getFirstNonPHI()),do { if (!(isa<CatchPadInst>(Handler->getFirstNonPHI
()))) { CheckFailed("CatchSwitchInst handlers must be catchpads"
, &CatchSwitch, Handler); return; } } while (0)
3512 "CatchSwitchInst handlers must be catchpads", &CatchSwitch, Handler)do { if (!(isa<CatchPadInst>(Handler->getFirstNonPHI
()))) { CheckFailed("CatchSwitchInst handlers must be catchpads"
, &CatchSwitch, Handler); return; } } while (0)
;
3513 }
3514
3515 visitEHPadPredecessors(CatchSwitch);
3516 visitTerminatorInst(CatchSwitch);
3517}
3518
3519void Verifier::visitCleanupReturnInst(CleanupReturnInst &CRI) {
3520 Assert(isa<CleanupPadInst>(CRI.getOperand(0)),do { if (!(isa<CleanupPadInst>(CRI.getOperand(0)))) { CheckFailed
("CleanupReturnInst needs to be provided a CleanupPad", &
CRI, CRI.getOperand(0)); return; } } while (0)
3521 "CleanupReturnInst needs to be provided a CleanupPad", &CRI,do { if (!(isa<CleanupPadInst>(CRI.getOperand(0)))) { CheckFailed
("CleanupReturnInst needs to be provided a CleanupPad", &
CRI, CRI.getOperand(0)); return; } } while (0)
3522 CRI.getOperand(0))do { if (!(isa<CleanupPadInst>(CRI.getOperand(0)))) { CheckFailed
("CleanupReturnInst needs to be provided a CleanupPad", &
CRI, CRI.getOperand(0)); return; } } while (0)
;
3523
3524 if (BasicBlock *UnwindDest = CRI.getUnwindDest()) {
3525 Instruction *I = UnwindDest->getFirstNonPHI();
3526 Assert(I->isEHPad() && !isa<LandingPadInst>(I),do { if (!(I->isEHPad() && !isa<LandingPadInst>
(I))) { CheckFailed("CleanupReturnInst must unwind to an EH block which is not a "
"landingpad.", &CRI); return; } } while (0)
3527 "CleanupReturnInst must unwind to an EH block which is not a "do { if (!(I->isEHPad() && !isa<LandingPadInst>
(I))) { CheckFailed("CleanupReturnInst must unwind to an EH block which is not a "
"landingpad.", &CRI); return; } } while (0)
3528 "landingpad.",do { if (!(I->isEHPad() && !isa<LandingPadInst>
(I))) { CheckFailed("CleanupReturnInst must unwind to an EH block which is not a "
"landingpad.", &CRI); return; } } while (0)
3529 &CRI)do { if (!(I->isEHPad() && !isa<LandingPadInst>
(I))) { CheckFailed("CleanupReturnInst must unwind to an EH block which is not a "
"landingpad.", &CRI); return; } } while (0)
;
3530 }
3531
3532 visitTerminatorInst(CRI);
3533}
3534
3535void Verifier::verifyDominatesUse(Instruction &I, unsigned i) {
3536 Instruction *Op = cast<Instruction>(I.getOperand(i));
3537 // If the we have an invalid invoke, don't try to compute the dominance.
3538 // We already reject it in the invoke specific checks and the dominance
3539 // computation doesn't handle multiple edges.
3540 if (InvokeInst *II = dyn_cast<InvokeInst>(Op)) {
3541 if (II->getNormalDest() == II->getUnwindDest())
3542 return;
3543 }
3544
3545 // Quick check whether the def has already been encountered in the same block.
3546 // PHI nodes are not checked to prevent accepting preceeding PHIs, because PHI
3547 // uses are defined to happen on the incoming edge, not at the instruction.
3548 //
3549 // FIXME: If this operand is a MetadataAsValue (wrapping a LocalAsMetadata)
3550 // wrapping an SSA value, assert that we've already encountered it. See
3551 // related FIXME in Mapper::mapLocalAsMetadata in ValueMapper.cpp.
3552 if (!isa<PHINode>(I) && InstsInThisBlock.count(Op))
3553 return;
3554
3555 const Use &U = I.getOperandUse(i);
3556 Assert(DT.dominates(Op, U),do { if (!(DT.dominates(Op, U))) { CheckFailed("Instruction does not dominate all uses!"
, Op, &I); return; } } while (0)
3557 "Instruction does not dominate all uses!", Op, &I)do { if (!(DT.dominates(Op, U))) { CheckFailed("Instruction does not dominate all uses!"
, Op, &I); return; } } while (0)
;
3558}
3559
3560void Verifier::visitDereferenceableMetadata(Instruction& I, MDNode* MD) {
3561 Assert(I.getType()->isPointerTy(), "dereferenceable, dereferenceable_or_null "do { if (!(I.getType()->isPointerTy())) { CheckFailed("dereferenceable, dereferenceable_or_null "
"apply only to pointer types", &I); return; } } while (0
)
3562 "apply only to pointer types", &I)do { if (!(I.getType()->isPointerTy())) { CheckFailed("dereferenceable, dereferenceable_or_null "
"apply only to pointer types", &I); return; } } while (0
)
;
3563 Assert(isa<LoadInst>(I),do { if (!(isa<LoadInst>(I))) { CheckFailed("dereferenceable, dereferenceable_or_null apply only to load"
" instructions, use attributes for calls or invokes", &I
); return; } } while (0)
3564 "dereferenceable, dereferenceable_or_null apply only to load"do { if (!(isa<LoadInst>(I))) { CheckFailed("dereferenceable, dereferenceable_or_null apply only to load"
" instructions, use attributes for calls or invokes", &I
); return; } } while (0)
3565 " instructions, use attributes for calls or invokes", &I)do { if (!(isa<LoadInst>(I))) { CheckFailed("dereferenceable, dereferenceable_or_null apply only to load"
" instructions, use attributes for calls or invokes", &I
); return; } } while (0)
;
3566 Assert(MD->getNumOperands() == 1, "dereferenceable, dereferenceable_or_null "do { if (!(MD->getNumOperands() == 1)) { CheckFailed("dereferenceable, dereferenceable_or_null "
"take one operand!", &I); return; } } while (0)
3567 "take one operand!", &I)do { if (!(MD->getNumOperands() == 1)) { CheckFailed("dereferenceable, dereferenceable_or_null "
"take one operand!", &I); return; } } while (0)
;
3568 ConstantInt *CI = mdconst::dyn_extract<ConstantInt>(MD->getOperand(0));
3569 Assert(CI && CI->getType()->isIntegerTy(64), "dereferenceable, "do { if (!(CI && CI->getType()->isIntegerTy(64)
)) { CheckFailed("dereferenceable, " "dereferenceable_or_null metadata value must be an i64!"
, &I); return; } } while (0)
3570 "dereferenceable_or_null metadata value must be an i64!", &I)do { if (!(CI && CI->getType()->isIntegerTy(64)
)) { CheckFailed("dereferenceable, " "dereferenceable_or_null metadata value must be an i64!"
, &I); return; } } while (0)
;
3571}
3572
3573/// verifyInstruction - Verify that an instruction is well formed.
3574///
3575void Verifier::visitInstruction(Instruction &I) {
3576 BasicBlock *BB = I.getParent();
3577 Assert(BB, "Instruction not embedded in basic block!", &I)do { if (!(BB)) { CheckFailed("Instruction not embedded in basic block!"
, &I); return; } } while (0)
;
3578
3579 if (!isa<PHINode>(I)) { // Check that non-phi nodes are not self referential
3580 for (User *U : I.users()) {
3581 Assert(U != (User *)&I || !DT.isReachableFromEntry(BB),do { if (!(U != (User *)&I || !DT.isReachableFromEntry(BB
))) { CheckFailed("Only PHI nodes may reference their own value!"
, &I); return; } } while (0)
3582 "Only PHI nodes may reference their own value!", &I)do { if (!(U != (User *)&I || !DT.isReachableFromEntry(BB
))) { CheckFailed("Only PHI nodes may reference their own value!"
, &I); return; } } while (0)
;
3583 }
3584 }
3585
3586 // Check that void typed values don't have names
3587 Assert(!I.getType()->isVoidTy() || !I.hasName(),do { if (!(!I.getType()->isVoidTy() || !I.hasName())) { CheckFailed
("Instruction has a name, but provides a void value!", &I
); return; } } while (0)
3588 "Instruction has a name, but provides a void value!", &I)do { if (!(!I.getType()->isVoidTy() || !I.hasName())) { CheckFailed
("Instruction has a name, but provides a void value!", &I
); return; } } while (0)
;
3589
3590 // Check that the return value of the instruction is either void or a legal
3591 // value type.
3592 Assert(I.getType()->isVoidTy() || I.getType()->isFirstClassType(),do { if (!(I.getType()->isVoidTy() || I.getType()->isFirstClassType
())) { CheckFailed("Instruction returns a non-scalar type!", &
I); return; } } while (0)
3593 "Instruction returns a non-scalar type!", &I)do { if (!(I.getType()->isVoidTy() || I.getType()->isFirstClassType
())) { CheckFailed("Instruction returns a non-scalar type!", &
I); return; } } while (0)
;
3594
3595 // Check that the instruction doesn't produce metadata. Calls are already
3596 // checked against the callee type.
3597 Assert(!I.getType()->isMetadataTy() || isa<CallInst>(I) || isa<InvokeInst>(I),do { if (!(!I.getType()->isMetadataTy() || isa<CallInst
>(I) || isa<InvokeInst>(I))) { CheckFailed("Invalid use of metadata!"
, &I); return; } } while (0)
3598 "Invalid use of metadata!", &I)do { if (!(!I.getType()->isMetadataTy() || isa<CallInst
>(I) || isa<InvokeInst>(I))) { CheckFailed("Invalid use of metadata!"
, &I); return; } } while (0)
;
3599
3600 // Check that all uses of the instruction, if they are instructions
3601 // themselves, actually have parent basic blocks. If the use is not an
3602 // instruction, it is an error!
3603 for (Use &U : I.uses()) {
3604 if (Instruction *Used = dyn_cast<Instruction>(U.getUser()))
3605 Assert(Used->getParent() != nullptr,do { if (!(Used->getParent() != nullptr)) { CheckFailed("Instruction referencing"
" instruction not embedded in a basic block!", &I, Used)
; return; } } while (0)
3606 "Instruction referencing"do { if (!(Used->getParent() != nullptr)) { CheckFailed("Instruction referencing"
" instruction not embedded in a basic block!", &I, Used)
; return; } } while (0)
3607 " instruction not embedded in a basic block!",do { if (!(Used->getParent() != nullptr)) { CheckFailed("Instruction referencing"
" instruction not embedded in a basic block!", &I, Used)
; return; } } while (0)
3608 &I, Used)do { if (!(Used->getParent() != nullptr)) { CheckFailed("Instruction referencing"
" instruction not embedded in a basic block!", &I, Used)
; return; } } while (0)
;
3609 else {
3610 CheckFailed("Use of instruction is not an instruction!", U);
3611 return;
3612 }
3613 }
3614
3615 for (unsigned i = 0, e = I.getNumOperands(); i != e; ++i) {
3616 Assert(I.getOperand(i) != nullptr, "Instruction has null operand!", &I)do { if (!(I.getOperand(i) != nullptr)) { CheckFailed("Instruction has null operand!"
, &I); return; } } while (0)
;
3617
3618 // Check to make sure that only first-class-values are operands to
3619 // instructions.
3620 if (!I.getOperand(i)->getType()->isFirstClassType()) {
3621 Assert(0, "Instruction operands must be first-class values!", &I)do { if (!(0)) { CheckFailed("Instruction operands must be first-class values!"
, &I); return; } } while (0)
;
3622 }
3623
3624 if (Function *F = dyn_cast<Function>(I.getOperand(i))) {
3625 // Check to make sure that the "address of" an intrinsic function is never
3626 // taken.
3627 Assert(do { if (!(!F->isIntrinsic() || i == (isa<CallInst>(
I) ? e - 1 : isa<InvokeInst>(I) ? e - 3 : 0))) { CheckFailed
("Cannot take the address of an intrinsic!", &I); return;
} } while (0)
3628 !F->isIntrinsic() ||do { if (!(!F->isIntrinsic() || i == (isa<CallInst>(
I) ? e - 1 : isa<InvokeInst>(I) ? e - 3 : 0))) { CheckFailed
("Cannot take the address of an intrinsic!", &I); return;
} } while (0)
3629 i == (isa<CallInst>(I) ? e - 1 : isa<InvokeInst>(I) ? e - 3 : 0),do { if (!(!F->isIntrinsic() || i == (isa<CallInst>(
I) ? e - 1 : isa<InvokeInst>(I) ? e - 3 : 0))) { CheckFailed
("Cannot take the address of an intrinsic!", &I); return;
} } while (0)
3630 "Cannot take the address of an intrinsic!", &I)do { if (!(!F->isIntrinsic() || i == (isa<CallInst>(
I) ? e - 1 : isa<InvokeInst>(I) ? e - 3 : 0))) { CheckFailed
("Cannot take the address of an intrinsic!", &I); return;
} } while (0)
;
3631 Assert(do { if (!(!F->isIntrinsic() || isa<CallInst>(I) || F
->getIntrinsicID() == Intrinsic::donothing || F->getIntrinsicID
() == Intrinsic::experimental_patchpoint_void || F->getIntrinsicID
() == Intrinsic::experimental_patchpoint_i64 || F->getIntrinsicID
() == Intrinsic::experimental_gc_statepoint)) { CheckFailed("Cannot invoke an intrinsic other than donothing, patchpoint or "
"statepoint", &I); return; } } while (0)
3632 !F->isIntrinsic() || isa<CallInst>(I) ||do { if (!(!F->isIntrinsic() || isa<CallInst>(I) || F
->getIntrinsicID() == Intrinsic::donothing || F->getIntrinsicID
() == Intrinsic::experimental_patchpoint_void || F->getIntrinsicID
() == Intrinsic::experimental_patchpoint_i64 || F->getIntrinsicID
() == Intrinsic::experimental_gc_statepoint)) { CheckFailed("Cannot invoke an intrinsic other than donothing, patchpoint or "
"statepoint", &I); return; } } while (0)
3633 F->getIntrinsicID() == Intrinsic::donothing ||do { if (!(!F->isIntrinsic() || isa<CallInst>(I) || F
->getIntrinsicID() == Intrinsic::donothing || F->getIntrinsicID
() == Intrinsic::experimental_patchpoint_void || F->getIntrinsicID
() == Intrinsic::experimental_patchpoint_i64 || F->getIntrinsicID
() == Intrinsic::experimental_gc_statepoint)) { CheckFailed("Cannot invoke an intrinsic other than donothing, patchpoint or "
"statepoint", &I); return; } } while (0)
3634 F->getIntrinsicID() == Intrinsic::experimental_patchpoint_void ||do { if (!(!F->isIntrinsic() || isa<CallInst>(I) || F
->getIntrinsicID() == Intrinsic::donothing || F->getIntrinsicID
() == Intrinsic::experimental_patchpoint_void || F->getIntrinsicID
() == Intrinsic::experimental_patchpoint_i64 || F->getIntrinsicID
() == Intrinsic::experimental_gc_statepoint)) { CheckFailed("Cannot invoke an intrinsic other than donothing, patchpoint or "
"statepoint", &I); return; } } while (0)
3635 F->getIntrinsicID() == Intrinsic::experimental_patchpoint_i64 ||do { if (!(!F->isIntrinsic() || isa<CallInst>(I) || F
->getIntrinsicID() == Intrinsic::donothing || F->getIntrinsicID
() == Intrinsic::experimental_patchpoint_void || F->getIntrinsicID
() == Intrinsic::experimental_patchpoint_i64 || F->getIntrinsicID
() == Intrinsic::experimental_gc_statepoint)) { CheckFailed("Cannot invoke an intrinsic other than donothing, patchpoint or "
"statepoint", &I); return; } } while (0)
3636 F->getIntrinsicID() == Intrinsic::experimental_gc_statepoint,do { if (!(!F->isIntrinsic() || isa<CallInst>(I) || F
->getIntrinsicID() == Intrinsic::donothing || F->getIntrinsicID
() == Intrinsic::experimental_patchpoint_void || F->getIntrinsicID
() == Intrinsic::experimental_patchpoint_i64 || F->getIntrinsicID
() == Intrinsic::experimental_gc_statepoint)) { CheckFailed("Cannot invoke an intrinsic other than donothing, patchpoint or "
"statepoint", &I); return; } } while (0)
3637 "Cannot invoke an intrinsic other than donothing, patchpoint or "do { if (!(!F->isIntrinsic() || isa<CallInst>(I) || F
->getIntrinsicID() == Intrinsic::donothing || F->getIntrinsicID
() == Intrinsic::experimental_patchpoint_void || F->getIntrinsicID
() == Intrinsic::experimental_patchpoint_i64 || F->getIntrinsicID
() == Intrinsic::experimental_gc_statepoint)) { CheckFailed("Cannot invoke an intrinsic other than donothing, patchpoint or "
"statepoint", &I); return; } } while (0)
3638 "statepoint",do { if (!(!F->isIntrinsic() || isa<CallInst>(I) || F
->getIntrinsicID() == Intrinsic::donothing || F->getIntrinsicID
() == Intrinsic::experimental_patchpoint_void || F->getIntrinsicID
() == Intrinsic::experimental_patchpoint_i64 || F->getIntrinsicID
() == Intrinsic::experimental_gc_statepoint)) { CheckFailed("Cannot invoke an intrinsic other than donothing, patchpoint or "
"statepoint", &I); return; } } while (0)
3639 &I)do { if (!(!F->isIntrinsic() || isa<CallInst>(I) || F
->getIntrinsicID() == Intrinsic::donothing || F->getIntrinsicID
() == Intrinsic::experimental_patchpoint_void || F->getIntrinsicID
() == Intrinsic::experimental_patchpoint_i64 || F->getIntrinsicID
() == Intrinsic::experimental_gc_statepoint)) { CheckFailed("Cannot invoke an intrinsic other than donothing, patchpoint or "
"statepoint", &I); return; } } while (0)
;
3640 Assert(F->getParent() == M, "Referencing function in another module!",do { if (!(F->getParent() == M)) { CheckFailed("Referencing function in another module!"
, &I, M, F, F->getParent()); return; } } while (0)
3641 &I, M, F, F->getParent())do { if (!(F->getParent() == M)) { CheckFailed("Referencing function in another module!"
, &I, M, F, F->getParent()); return; } } while (0)
;
3642 } else if (BasicBlock *OpBB = dyn_cast<BasicBlock>(I.getOperand(i))) {
3643 Assert(OpBB->getParent() == BB->getParent(),do { if (!(OpBB->getParent() == BB->getParent())) { CheckFailed
("Referring to a basic block in another function!", &I); return
; } } while (0)
3644 "Referring to a basic block in another function!", &I)do { if (!(OpBB->getParent() == BB->getParent())) { CheckFailed
("Referring to a basic block in another function!", &I); return
; } } while (0)
;
3645 } else if (Argument *OpArg = dyn_cast<Argument>(I.getOperand(i))) {
3646 Assert(OpArg->getParent() == BB->getParent(),do { if (!(OpArg->getParent() == BB->getParent())) { CheckFailed
("Referring to an argument in another function!", &I); return
; } } while (0)
3647 "Referring to an argument in another function!", &I)do { if (!(OpArg->getParent() == BB->getParent())) { CheckFailed
("Referring to an argument in another function!", &I); return
; } } while (0)
;
3648 } else if (GlobalValue *GV = dyn_cast<GlobalValue>(I.getOperand(i))) {
3649 Assert(GV->getParent() == M, "Referencing global in another module!", &I, M, GV, GV->getParent())do { if (!(GV->getParent() == M)) { CheckFailed("Referencing global in another module!"
, &I, M, GV, GV->getParent()); return; } } while (0)
;
3650 } else if (isa<Instruction>(I.getOperand(i))) {
3651 verifyDominatesUse(I, i);
3652 } else if (isa<InlineAsm>(I.getOperand(i))) {
3653 Assert((i + 1 == e && isa<CallInst>(I)) ||do { if (!((i + 1 == e && isa<CallInst>(I)) || (
i + 3 == e && isa<InvokeInst>(I)))) { CheckFailed
("Cannot take the address of an inline asm!", &I); return
; } } while (0)
3654 (i + 3 == e && isa<InvokeInst>(I)),do { if (!((i + 1 == e && isa<CallInst>(I)) || (
i + 3 == e && isa<InvokeInst>(I)))) { CheckFailed
("Cannot take the address of an inline asm!", &I); return
; } } while (0)
3655 "Cannot take the address of an inline asm!", &I)do { if (!((i + 1 == e && isa<CallInst>(I)) || (
i + 3 == e && isa<InvokeInst>(I)))) { CheckFailed
("Cannot take the address of an inline asm!", &I); return
; } } while (0)
;
3656 } else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(I.getOperand(i))) {
3657 if (CE->getType()->isPtrOrPtrVectorTy()) {
3658 // If we have a ConstantExpr pointer, we need to see if it came from an
3659 // illegal bitcast (inttoptr <constant int> )
3660 visitConstantExprsRecursively(CE);
3661 }
3662 }
3663 }
3664
3665 if (MDNode *MD = I.getMetadata(LLVMContext::MD_fpmath)) {
3666 Assert(I.getType()->isFPOrFPVectorTy(),do { if (!(I.getType()->isFPOrFPVectorTy())) { CheckFailed
("fpmath requires a floating point result!", &I); return;
} } while (0)
3667 "fpmath requires a floating point result!", &I)do { if (!(I.getType()->isFPOrFPVectorTy())) { CheckFailed
("fpmath requires a floating point result!", &I); return;
} } while (0)
;
3668 Assert(MD->getNumOperands() == 1, "fpmath takes one operand!", &I)do { if (!(MD->getNumOperands() == 1)) { CheckFailed("fpmath takes one operand!"
, &I); return; } } while (0)
;
3669 if (ConstantFP *CFP0 =
3670 mdconst::dyn_extract_or_null<ConstantFP>(MD->getOperand(0))) {
3671 APFloat Accuracy = CFP0->getValueAPF();
3672 Assert(Accuracy.isFiniteNonZero() && !Accuracy.isNegative(),do { if (!(Accuracy.isFiniteNonZero() && !Accuracy.isNegative
())) { CheckFailed("fpmath accuracy not a positive number!", &
I); return; } } while (0)
3673 "fpmath accuracy not a positive number!", &I)do { if (!(Accuracy.isFiniteNonZero() && !Accuracy.isNegative
())) { CheckFailed("fpmath accuracy not a positive number!", &
I); return; } } while (0)
;
3674 } else {
3675 Assert(false, "invalid fpmath accuracy!", &I)do { if (!(false)) { CheckFailed("invalid fpmath accuracy!", &
I); return; } } while (0)
;
3676 }
3677 }
3678
3679 if (MDNode *Range = I.getMetadata(LLVMContext::MD_range)) {
3680 Assert(isa<LoadInst>(I) || isa<CallInst>(I) || isa<InvokeInst>(I),do { if (!(isa<LoadInst>(I) || isa<CallInst>(I) ||
isa<InvokeInst>(I))) { CheckFailed("Ranges are only for loads, calls and invokes!"
, &I); return; } } while (0)
3681 "Ranges are only for loads, calls and invokes!", &I)do { if (!(isa<LoadInst>(I) || isa<CallInst>(I) ||
isa<InvokeInst>(I))) { CheckFailed("Ranges are only for loads, calls and invokes!"
, &I); return; } } while (0)
;
3682 visitRangeMetadata(I, Range, I.getType());
3683 }
3684
3685 if (I.getMetadata(LLVMContext::MD_nonnull)) {
3686 Assert(I.getType()->isPointerTy(), "nonnull applies only to pointer types",do { if (!(I.getType()->isPointerTy())) { CheckFailed("nonnull applies only to pointer types"
, &I); return; } } while (0)
3687 &I)do { if (!(I.getType()->isPointerTy())) { CheckFailed("nonnull applies only to pointer types"
, &I); return; } } while (0)
;
3688 Assert(isa<LoadInst>(I),do { if (!(isa<LoadInst>(I))) { CheckFailed("nonnull applies only to load instructions, use attributes"
" for calls or invokes", &I); return; } } while (0)
3689 "nonnull applies only to load instructions, use attributes"do { if (!(isa<LoadInst>(I))) { CheckFailed("nonnull applies only to load instructions, use attributes"
" for calls or invokes", &I); return; } } while (0)
3690 " for calls or invokes",do { if (!(isa<LoadInst>(I))) { CheckFailed("nonnull applies only to load instructions, use attributes"
" for calls or invokes", &I); return; } } while (0)
3691 &I)do { if (!(isa<LoadInst>(I))) { CheckFailed("nonnull applies only to load instructions, use attributes"
" for calls or invokes", &I); return; } } while (0)
;
3692 }
3693
3694 if (MDNode *MD = I.getMetadata(LLVMContext::MD_dereferenceable))
3695 visitDereferenceableMetadata(I, MD);
3696
3697 if (MDNode *MD = I.getMetadata(LLVMContext::MD_dereferenceable_or_null))
3698 visitDereferenceableMetadata(I, MD);
3699
3700 if (MDNode *AlignMD = I.getMetadata(LLVMContext::MD_align)) {
3701 Assert(I.getType()->isPointerTy(), "align applies only to pointer types",do { if (!(I.getType()->isPointerTy())) { CheckFailed("align applies only to pointer types"
, &I); return; } } while (0)
3702 &I)do { if (!(I.getType()->isPointerTy())) { CheckFailed("align applies only to pointer types"
, &I); return; } } while (0)
;
3703 Assert(isa<LoadInst>(I), "align applies only to load instructions, "do { if (!(isa<LoadInst>(I))) { CheckFailed("align applies only to load instructions, "
"use attributes for calls or invokes", &I); return; } } while
(0)
3704 "use attributes for calls or invokes", &I)do { if (!(isa<LoadInst>(I))) { CheckFailed("align applies only to load instructions, "
"use attributes for calls or invokes", &I); return; } } while
(0)
;
3705 Assert(AlignMD->getNumOperands() == 1, "align takes one operand!", &I)do { if (!(AlignMD->getNumOperands() == 1)) { CheckFailed(
"align takes one operand!", &I); return; } } while (0)
;
3706 ConstantInt *CI = mdconst::dyn_extract<ConstantInt>(AlignMD->getOperand(0));
3707 Assert(CI && CI->getType()->isIntegerTy(64),do { if (!(CI && CI->getType()->isIntegerTy(64)
)) { CheckFailed("align metadata value must be an i64!", &
I); return; } } while (0)
3708 "align metadata value must be an i64!", &I)do { if (!(CI && CI->getType()->isIntegerTy(64)
)) { CheckFailed("align metadata value must be an i64!", &
I); return; } } while (0)
;
3709 uint64_t Align = CI->getZExtValue();
3710 Assert(isPowerOf2_64(Align),do { if (!(isPowerOf2_64(Align))) { CheckFailed("align metadata value must be a power of 2!"
, &I); return; } } while (0)
3711 "align metadata value must be a power of 2!", &I)do { if (!(isPowerOf2_64(Align))) { CheckFailed("align metadata value must be a power of 2!"
, &I); return; } } while (0)
;
3712 Assert(Align <= Value::MaximumAlignment,do { if (!(Align <= Value::MaximumAlignment)) { CheckFailed
("alignment is larger that implementation defined limit", &
I); return; } } while (0)
3713 "alignment is larger that implementation defined limit", &I)do { if (!(Align <= Value::MaximumAlignment)) { CheckFailed
("alignment is larger that implementation defined limit", &
I); return; } } while (0)
;
3714 }
3715
3716 if (MDNode *N = I.getDebugLoc().getAsMDNode()) {
3717 AssertDI(isa<DILocation>(N), "invalid !dbg metadata attachment", &I, N)do { if (!(isa<DILocation>(N))) { DebugInfoCheckFailed(
"invalid !dbg metadata attachment", &I, N); return; } } while
(0)
;
3718 visitMDNode(*N);
3719 }
3720
3721 if (auto *DII = dyn_cast<DbgInfoIntrinsic>(&I))
3722 verifyBitPieceExpression(*DII);
3723
3724 InstsInThisBlock.insert(&I);
3725}
3726
3727/// Verify that the specified type (which comes from an intrinsic argument or
3728/// return value) matches the type constraints specified by the .td file (e.g.
3729/// an "any integer" argument really is an integer).
3730///
3731/// This returns true on error but does not print a message.
3732bool Verifier::verifyIntrinsicType(Type *Ty,
3733 ArrayRef<Intrinsic::IITDescriptor> &Infos,
3734 SmallVectorImpl<Type*> &ArgTys) {
3735 using namespace Intrinsic;
3736
3737 // If we ran out of descriptors, there are too many arguments.
3738 if (Infos.empty()) return true;
3739 IITDescriptor D = Infos.front();
3740 Infos = Infos.slice(1);
3741
3742 switch (D.Kind) {
3743 case IITDescriptor::Void: return !Ty->isVoidTy();
3744 case IITDescriptor::VarArg: return true;
3745 case IITDescriptor::MMX: return !Ty->isX86_MMXTy();
3746 case IITDescriptor::Token: return !Ty->isTokenTy();
3747 case IITDescriptor::Metadata: return !Ty->isMetadataTy();
3748 case IITDescriptor::Half: return !Ty->isHalfTy();
3749 case IITDescriptor::Float: return !Ty->isFloatTy();
3750 case IITDescriptor::Double: return !Ty->isDoubleTy();
3751 case IITDescriptor::Integer: return !Ty->isIntegerTy(D.Integer_Width);
3752 case IITDescriptor::Vector: {
3753 VectorType *VT = dyn_cast<VectorType>(Ty);
3754 return !VT || VT->getNumElements() != D.Vector_Width ||
3755 verifyIntrinsicType(VT->getElementType(), Infos, ArgTys);
3756 }
3757 case IITDescriptor::Pointer: {
3758 PointerType *PT = dyn_cast<PointerType>(Ty);
3759 return !PT || PT->getAddressSpace() != D.Pointer_AddressSpace ||
3760 verifyIntrinsicType(PT->getElementType(), Infos, ArgTys);
3761 }
3762
3763 case IITDescriptor::Struct: {
3764 StructType *ST = dyn_cast<StructType>(Ty);
3765 if (!ST || ST->getNumElements() != D.Struct_NumElements)
3766 return true;
3767
3768 for (unsigned i = 0, e = D.Struct_NumElements; i != e; ++i)
3769 if (verifyIntrinsicType(ST->getElementType(i), Infos, ArgTys))
3770 return true;
3771 return false;
3772 }
3773
3774 case IITDescriptor::Argument:
3775 // Two cases here - If this is the second occurrence of an argument, verify
3776 // that the later instance matches the previous instance.
3777 if (D.getArgumentNumber() < ArgTys.size())
3778 return Ty != ArgTys[D.getArgumentNumber()];
3779
3780 // Otherwise, if this is the first instance of an argument, record it and
3781 // verify the "Any" kind.
3782 assert(D.getArgumentNumber() == ArgTys.size() && "Table consistency error")((D.getArgumentNumber() == ArgTys.size() && "Table consistency error"
) ? static_cast<void> (0) : __assert_fail ("D.getArgumentNumber() == ArgTys.size() && \"Table consistency error\""
, "/tmp/buildd/llvm-toolchain-snapshot-3.9~svn271203/lib/IR/Verifier.cpp"
, 3782, __PRETTY_FUNCTION__))
;
3783 ArgTys.push_back(Ty);
3784
3785 switch (D.getArgumentKind()) {
3786 case IITDescriptor::AK_Any: return false; // Success
3787 case IITDescriptor::AK_AnyInteger: return !Ty->isIntOrIntVectorTy();
3788 case IITDescriptor::AK_AnyFloat: return !Ty->isFPOrFPVectorTy();
3789 case IITDescriptor::AK_AnyVector: return !isa<VectorType>(Ty);
3790 case IITDescriptor::AK_AnyPointer: return !isa<PointerType>(Ty);
3791 }
3792 llvm_unreachable("all argument kinds not covered")::llvm::llvm_unreachable_internal("all argument kinds not covered"
, "/tmp/buildd/llvm-toolchain-snapshot-3.9~svn271203/lib/IR/Verifier.cpp"
, 3792)
;
3793
3794 case IITDescriptor::ExtendArgument: {
3795 // This may only be used when referring to a previous vector argument.
3796 if (D.getArgumentNumber() >= ArgTys.size())
3797 return true;
3798
3799 Type *NewTy = ArgTys[D.getArgumentNumber()];
3800 if (VectorType *VTy = dyn_cast<VectorType>(NewTy))
3801 NewTy = VectorType::getExtendedElementVectorType(VTy);
3802 else if (IntegerType *ITy = dyn_cast<IntegerType>(NewTy))
3803 NewTy = IntegerType::get(ITy->getContext(), 2 * ITy->getBitWidth());
3804 else
3805 return true;
3806
3807 return Ty != NewTy;
3808 }
3809 case IITDescriptor::TruncArgument: {
3810 // This may only be used when referring to a previous vector argument.
3811 if (D.getArgumentNumber() >= ArgTys.size())
3812 return true;
3813
3814 Type *NewTy = ArgTys[D.getArgumentNumber()];
3815 if (VectorType *VTy = dyn_cast<VectorType>(NewTy))
3816 NewTy = VectorType::getTruncatedElementVectorType(VTy);
3817 else if (IntegerType *ITy = dyn_cast<IntegerType>(NewTy))
3818 NewTy = IntegerType::get(ITy->getContext(), ITy->getBitWidth() / 2);
3819 else
3820 return true;
3821
3822 return Ty != NewTy;
3823 }
3824 case IITDescriptor::HalfVecArgument:
3825 // This may only be used when referring to a previous vector argument.
3826 return D.getArgumentNumber() >= ArgTys.size() ||
3827 !isa<VectorType>(ArgTys[D.getArgumentNumber()]) ||
3828 VectorType::getHalfElementsVectorType(
3829 cast<VectorType>(ArgTys[D.getArgumentNumber()])) != Ty;
3830 case IITDescriptor::SameVecWidthArgument: {
3831 if (D.getArgumentNumber() >= ArgTys.size())
3832 return true;
3833 VectorType * ReferenceType =
3834 dyn_cast<VectorType>(ArgTys[D.getArgumentNumber()]);
3835 VectorType *ThisArgType = dyn_cast<VectorType>(Ty);
3836 if (!ThisArgType || !ReferenceType ||
3837 (ReferenceType->getVectorNumElements() !=
3838 ThisArgType->getVectorNumElements()))
3839 return true;
3840 return verifyIntrinsicType(ThisArgType->getVectorElementType(),
3841 Infos, ArgTys);
3842 }
3843 case IITDescriptor::PtrToArgument: {
3844 if (D.getArgumentNumber() >= ArgTys.size())
3845 return true;
3846 Type * ReferenceType = ArgTys[D.getArgumentNumber()];
3847 PointerType *ThisArgType = dyn_cast<PointerType>(Ty);
3848 return (!ThisArgType || ThisArgType->getElementType() != ReferenceType);
3849 }
3850 case IITDescriptor::VecOfPtrsToElt: {
3851 if (D.getArgumentNumber() >= ArgTys.size())
3852 return true;
3853 VectorType * ReferenceType =
3854 dyn_cast<VectorType> (ArgTys[D.getArgumentNumber()]);
3855 VectorType *ThisArgVecTy = dyn_cast<VectorType>(Ty);
3856 if (!ThisArgVecTy || !ReferenceType ||
3857 (ReferenceType->getVectorNumElements() !=
3858 ThisArgVecTy->getVectorNumElements()))
3859 return true;
3860 PointerType *ThisArgEltTy =
3861 dyn_cast<PointerType>(ThisArgVecTy->getVectorElementType());
3862 if (!ThisArgEltTy)
3863 return true;
3864 return ThisArgEltTy->getElementType() !=
3865 ReferenceType->getVectorElementType();
3866 }
3867 }
3868 llvm_unreachable("unhandled")::llvm::llvm_unreachable_internal("unhandled", "/tmp/buildd/llvm-toolchain-snapshot-3.9~svn271203/lib/IR/Verifier.cpp"
, 3868)
;
3869}
3870
3871/// Verify if the intrinsic has variable arguments. This method is intended to
3872/// be called after all the fixed arguments have been verified first.
3873///
3874/// This method returns true on error and does not print an error message.
3875bool
3876Verifier::verifyIntrinsicIsVarArg(bool isVarArg,
3877 ArrayRef<Intrinsic::IITDescriptor> &Infos) {
3878 using namespace Intrinsic;
3879
3880 // If there are no descriptors left, then it can't be a vararg.
3881 if (Infos.empty())
3882 return isVarArg;
3883
3884 // There should be only one descriptor remaining at this point.
3885 if (Infos.size() != 1)
3886 return true;
3887
3888 // Check and verify the descriptor.
3889 IITDescriptor D = Infos.front();
3890 Infos = Infos.slice(1);
3891 if (D.Kind == IITDescriptor::VarArg)
3892 return !isVarArg;
3893
3894 return true;
3895}
3896
3897/// Allow intrinsics to be verified in different ways.
3898void Verifier::visitIntrinsicCallSite(Intrinsic::ID ID, CallSite CS) {
3899 Function *IF = CS.getCalledFunction();
3900 Assert(IF->isDeclaration(), "Intrinsic functions should never be defined!",do { if (!(IF->isDeclaration())) { CheckFailed("Intrinsic functions should never be defined!"
, IF); return; } } while (0)
3901 IF)do { if (!(IF->isDeclaration())) { CheckFailed("Intrinsic functions should never be defined!"
, IF); return; } } while (0)
;
3902
3903 // Verify that the intrinsic prototype lines up with what the .td files
3904 // describe.
3905 FunctionType *IFTy = IF->getFunctionType();
3906 bool IsVarArg = IFTy->isVarArg();
3907
3908 SmallVector<Intrinsic::IITDescriptor, 8> Table;
3909 getIntrinsicInfoTableEntries(ID, Table);
3910 ArrayRef<Intrinsic::IITDescriptor> TableRef = Table;
3911
3912 SmallVector<Type *, 4> ArgTys;
3913 Assert(!verifyIntrinsicType(IFTy->getReturnType(), TableRef, ArgTys),do { if (!(!verifyIntrinsicType(IFTy->getReturnType(), TableRef
, ArgTys))) { CheckFailed("Intrinsic has incorrect return type!"
, IF); return; } } while (0)
3914 "Intrinsic has incorrect return type!", IF)do { if (!(!verifyIntrinsicType(IFTy->getReturnType(), TableRef
, ArgTys))) { CheckFailed("Intrinsic has incorrect return type!"
, IF); return; } } while (0)
;
3915 for (unsigned i = 0, e = IFTy->getNumParams(); i != e; ++i)
3916 Assert(!verifyIntrinsicType(IFTy->getParamType(i), TableRef, ArgTys),do { if (!(!verifyIntrinsicType(IFTy->getParamType(i), TableRef
, ArgTys))) { CheckFailed("Intrinsic has incorrect argument type!"
, IF); return; } } while (0)
3917 "Intrinsic has incorrect argument type!", IF)do { if (!(!verifyIntrinsicType(IFTy->getParamType(i), TableRef
, ArgTys))) { CheckFailed("Intrinsic has incorrect argument type!"
, IF); return; } } while (0)
;
3918
3919 // Verify if the intrinsic call matches the vararg property.
3920 if (IsVarArg)
3921 Assert(!verifyIntrinsicIsVarArg(IsVarArg, TableRef),do { if (!(!verifyIntrinsicIsVarArg(IsVarArg, TableRef))) { CheckFailed
("Intrinsic was not defined with variable arguments!", IF); return
; } } while (0)
3922 "Intrinsic was not defined with variable arguments!", IF)do { if (!(!verifyIntrinsicIsVarArg(IsVarArg, TableRef))) { CheckFailed
("Intrinsic was not defined with variable arguments!", IF); return
; } } while (0)
;
3923 else
3924 Assert(!verifyIntrinsicIsVarArg(IsVarArg, TableRef),do { if (!(!verifyIntrinsicIsVarArg(IsVarArg, TableRef))) { CheckFailed
("Callsite was not defined with variable arguments!", IF); return
; } } while (0)
3925 "Callsite was not defined with variable arguments!", IF)do { if (!(!verifyIntrinsicIsVarArg(IsVarArg, TableRef))) { CheckFailed
("Callsite was not defined with variable arguments!", IF); return
; } } while (0)
;
3926
3927 // All descriptors should be absorbed by now.
3928 Assert(TableRef.empty(), "Intrinsic has too few arguments!", IF)do { if (!(TableRef.empty())) { CheckFailed("Intrinsic has too few arguments!"
, IF); return; } } while (0)
;
3929
3930 // Now that we have the intrinsic ID and the actual argument types (and we
3931 // know they are legal for the intrinsic!) get the intrinsic name through the
3932 // usual means. This allows us to verify the mangling of argument types into
3933 // the name.
3934 const std::string ExpectedName = Intrinsic::getName(ID, ArgTys);
3935 Assert(ExpectedName == IF->getName(),do { if (!(ExpectedName == IF->getName())) { CheckFailed("Intrinsic name not mangled correctly for type arguments! "
"Should be: " + ExpectedName, IF); return; } } while (0)
3936 "Intrinsic name not mangled correctly for type arguments! "do { if (!(ExpectedName == IF->getName())) { CheckFailed("Intrinsic name not mangled correctly for type arguments! "
"Should be: " + ExpectedName, IF); return; } } while (0)
3937 "Should be: " +do { if (!(ExpectedName == IF->getName())) { CheckFailed("Intrinsic name not mangled correctly for type arguments! "
"Should be: " + ExpectedName, IF); return; } } while (0)
3938 ExpectedName,do { if (!(ExpectedName == IF->getName())) { CheckFailed("Intrinsic name not mangled correctly for type arguments! "
"Should be: " + ExpectedName, IF); return; } } while (0)
3939 IF)do { if (!(ExpectedName == IF->getName())) { CheckFailed("Intrinsic name not mangled correctly for type arguments! "
"Should be: " + ExpectedName, IF); return; } } while (0)
;
3940
3941 // If the intrinsic takes MDNode arguments, verify that they are either global
3942 // or are local to *this* function.
3943 for (Value *V : CS.args())
3944 if (auto *MD = dyn_cast<MetadataAsValue>(V))
3945 visitMetadataAsValue(*MD, CS.getCaller());
3946
3947 switch (ID) {
3948 default:
3949 break;
3950 case Intrinsic::ctlz: // llvm.ctlz
3951 case Intrinsic::cttz: // llvm.cttz
3952 Assert(isa<ConstantInt>(CS.getArgOperand(1)),do { if (!(isa<ConstantInt>(CS.getArgOperand(1)))) { CheckFailed
("is_zero_undef argument of bit counting intrinsics must be a "
"constant int", CS); return; } } while (0)
3953 "is_zero_undef argument of bit counting intrinsics must be a "do { if (!(isa<ConstantInt>(CS.getArgOperand(1)))) { CheckFailed
("is_zero_undef argument of bit counting intrinsics must be a "
"constant int", CS); return; } } while (0)
3954 "constant int",do { if (!(isa<ConstantInt>(CS.getArgOperand(1)))) { CheckFailed
("is_zero_undef argument of bit counting intrinsics must be a "
"constant int", CS); return; } } while (0)
3955 CS)do { if (!(isa<ConstantInt>(CS.getArgOperand(1)))) { CheckFailed
("is_zero_undef argument of bit counting intrinsics must be a "
"constant int", CS); return; } } while (0)
;
3956 break;
3957 case Intrinsic::dbg_declare: // llvm.dbg.declare
3958 Assert(isa<MetadataAsValue>(CS.getArgOperand(0)),do { if (!(isa<MetadataAsValue>(CS.getArgOperand(0)))) {
CheckFailed("invalid llvm.dbg.declare intrinsic call 1", CS)
; return; } } while (0)
3959 "invalid llvm.dbg.declare intrinsic call 1", CS)do { if (!(isa<MetadataAsValue>(CS.getArgOperand(0)))) {
CheckFailed("invalid llvm.dbg.declare intrinsic call 1", CS)
; return; } } while (0)
;
3960 visitDbgIntrinsic("declare", cast<DbgDeclareInst>(*CS.getInstruction()));
3961 break;
3962 case Intrinsic::dbg_value: // llvm.dbg.value
3963 visitDbgIntrinsic("value", cast<DbgValueInst>(*CS.getInstruction()));
3964 break;
3965 case Intrinsic::memcpy:
3966 case Intrinsic::memmove:
3967 case Intrinsic::memset: {
3968 ConstantInt *AlignCI = dyn_cast<ConstantInt>(CS.getArgOperand(3));
3969 Assert(AlignCI,do { if (!(AlignCI)) { CheckFailed("alignment argument of memory intrinsics must be a constant int"
, CS); return; } } while (0)
3970 "alignment argument of memory intrinsics must be a constant int",do { if (!(AlignCI)) { CheckFailed("alignment argument of memory intrinsics must be a constant int"
, CS); return; } } while (0)
3971 CS)do { if (!(AlignCI)) { CheckFailed("alignment argument of memory intrinsics must be a constant int"
, CS); return; } } while (0)
;
3972 const APInt &AlignVal = AlignCI->getValue();
3973 Assert(AlignCI->isZero() || AlignVal.isPowerOf2(),do { if (!(AlignCI->isZero() || AlignVal.isPowerOf2())) { CheckFailed
("alignment argument of memory intrinsics must be a power of 2"
, CS); return; } } while (0)
3974 "alignment argument of memory intrinsics must be a power of 2", CS)do { if (!(AlignCI->isZero() || AlignVal.isPowerOf2())) { CheckFailed
("alignment argument of memory intrinsics must be a power of 2"
, CS); return; } } while (0)
;
3975 Assert(isa<ConstantInt>(CS.getArgOperand(4)),do { if (!(isa<ConstantInt>(CS.getArgOperand(4)))) { CheckFailed
("isvolatile argument of memory intrinsics must be a constant int"
, CS); return; } } while (0)
3976 "isvolatile argument of memory intrinsics must be a constant int",do { if (!(isa<ConstantInt>(CS.getArgOperand(4)))) { CheckFailed
("isvolatile argument of memory intrinsics must be a constant int"
, CS); return; } } while (0)
3977 CS)do { if (!(isa<ConstantInt>(CS.getArgOperand(4)))) { CheckFailed
("isvolatile argument of memory intrinsics must be a constant int"
, CS); return; } } while (0)
;
3978 break;
3979 }
3980 case Intrinsic::gcroot:
3981 case Intrinsic::gcwrite:
3982 case Intrinsic::gcread:
3983 if (ID == Intrinsic::gcroot) {
3984 AllocaInst *AI =
3985 dyn_cast<AllocaInst>(CS.getArgOperand(0)->stripPointerCasts());
3986 Assert(AI, "llvm.gcroot parameter #1 must be an alloca.", CS)do { if (!(AI)) { CheckFailed("llvm.gcroot parameter #1 must be an alloca."
, CS); return; } } while (0)
;
3987 Assert(isa<Constant>(CS.getArgOperand(1)),do { if (!(isa<Constant>(CS.getArgOperand(1)))) { CheckFailed
("llvm.gcroot parameter #2 must be a constant.", CS); return;
} } while (0)
3988 "llvm.gcroot parameter #2 must be a constant.", CS)do { if (!(isa<Constant>(CS.getArgOperand(1)))) { CheckFailed
("llvm.gcroot parameter #2 must be a constant.", CS); return;
} } while (0)
;
3989 if (!AI->getAllocatedType()->isPointerTy()) {
3990 Assert(!isa<ConstantPointerNull>(CS.getArgOperand(1)),do { if (!(!isa<ConstantPointerNull>(CS.getArgOperand(1
)))) { CheckFailed("llvm.gcroot parameter #1 must either be a pointer alloca, "
"or argument #2 must be a non-null constant.", CS); return; }
} while (0)
3991 "llvm.gcroot parameter #1 must either be a pointer alloca, "do { if (!(!isa<ConstantPointerNull>(CS.getArgOperand(1
)))) { CheckFailed("llvm.gcroot parameter #1 must either be a pointer alloca, "
"or argument #2 must be a non-null constant.", CS); return; }
} while (0)
3992 "or argument #2 must be a non-null constant.",do { if (!(!isa<ConstantPointerNull>(CS.getArgOperand(1
)))) { CheckFailed("llvm.gcroot parameter #1 must either be a pointer alloca, "
"or argument #2 must be a non-null constant.", CS); return; }
} while (0)
3993 CS)do { if (!(!isa<ConstantPointerNull>(CS.getArgOperand(1
)))) { CheckFailed("llvm.gcroot parameter #1 must either be a pointer alloca, "
"or argument #2 must be a non-null constant.", CS); return; }
} while (0)
;
3994 }
3995 }
3996
3997 Assert(CS.getParent()->getParent()->hasGC(),do { if (!(CS.getParent()->getParent()->hasGC())) { CheckFailed
("Enclosing function does not use GC.", CS); return; } } while
(0)
3998 "Enclosing function does not use GC.", CS)do { if (!(CS.getParent()->getParent()->hasGC())) { CheckFailed
("Enclosing function does not use GC.", CS); return; } } while
(0)
;
3999 break;
4000 case Intrinsic::init_trampoline:
4001 Assert(isa<Function>(CS.getArgOperand(1)->stripPointerCasts()),do { if (!(isa<Function>(CS.getArgOperand(1)->stripPointerCasts
()))) { CheckFailed("llvm.init_trampoline parameter #2 must resolve to a function."
, CS); return; } } while (0)
4002 "llvm.init_trampoline parameter #2 must resolve to a function.",do { if (!(isa<Function>(CS.getArgOperand(1)->stripPointerCasts
()))) { CheckFailed("llvm.init_trampoline parameter #2 must resolve to a function."
, CS); return; } } while (0)
4003 CS)do { if (!(isa<Function>(CS.getArgOperand(1)->stripPointerCasts
()))) { CheckFailed("llvm.init_trampoline parameter #2 must resolve to a function."
, CS); return; } } while (0)
;
4004 break;
4005 case Intrinsic::prefetch:
4006 Assert(isa<ConstantInt>(CS.getArgOperand(1)) &&do { if (!(isa<ConstantInt>(CS.getArgOperand(1)) &&
isa<ConstantInt>(CS.getArgOperand(2)) && cast<
ConstantInt>(CS.getArgOperand(1))->getZExtValue() < 2
&& cast<ConstantInt>(CS.getArgOperand(2))->
getZExtValue() < 4)) { CheckFailed("invalid arguments to llvm.prefetch"
, CS); return; } } while (0)
4007 isa<ConstantInt>(CS.getArgOperand(2)) &&do { if (!(isa<ConstantInt>(CS.getArgOperand(1)) &&
isa<ConstantInt>(CS.getArgOperand(2)) && cast<
ConstantInt>(CS.getArgOperand(1))->getZExtValue() < 2
&& cast<ConstantInt>(CS.getArgOperand(2))->
getZExtValue() < 4)) { CheckFailed("invalid arguments to llvm.prefetch"
, CS); return; } } while (0)
4008 cast<ConstantInt>(CS.getArgOperand(1))->getZExtValue() < 2 &&do { if (!(isa<ConstantInt>(CS.getArgOperand(1)) &&
isa<ConstantInt>(CS.getArgOperand(2)) && cast<
ConstantInt>(CS.getArgOperand(1))->getZExtValue() < 2
&& cast<ConstantInt>(CS.getArgOperand(2))->
getZExtValue() < 4)) { CheckFailed("invalid arguments to llvm.prefetch"
, CS); return; } } while (0)
4009 cast<ConstantInt>(CS.getArgOperand(2))->getZExtValue() < 4,do { if (!(isa<ConstantInt>(CS.getArgOperand(1)) &&
isa<ConstantInt>(CS.getArgOperand(2)) && cast<
ConstantInt>(CS.getArgOperand(1))->getZExtValue() < 2
&& cast<ConstantInt>(CS.getArgOperand(2))->
getZExtValue() < 4)) { CheckFailed("invalid arguments to llvm.prefetch"
, CS); return; } } while (0)
4010 "invalid arguments to llvm.prefetch", CS)do { if (!(isa<ConstantInt>(CS.getArgOperand(1)) &&
isa<ConstantInt>(CS.getArgOperand(2)) && cast<
ConstantInt>(CS.getArgOperand(1))->getZExtValue() < 2
&& cast<ConstantInt>(CS.getArgOperand(2))->
getZExtValue() < 4)) { CheckFailed("invalid arguments to llvm.prefetch"
, CS); return; } } while (0)
;
4011 break;
4012 case Intrinsic::stackprotector:
4013 Assert(isa<AllocaInst>(CS.getArgOperand(1)->stripPointerCasts()),do { if (!(isa<AllocaInst>(CS.getArgOperand(1)->stripPointerCasts
()))) { CheckFailed("llvm.stackprotector parameter #2 must resolve to an alloca."
, CS); return; } } while (0)
4014 "llvm.stackprotector parameter #2 must resolve to an alloca.", CS)do { if (!(isa<AllocaInst>(CS.getArgOperand(1)->stripPointerCasts
()))) { CheckFailed("llvm.stackprotector parameter #2 must resolve to an alloca."
, CS); return; } } while (0)
;
4015 break;
4016 case Intrinsic::lifetime_start:
4017 case Intrinsic::lifetime_end:
4018 case Intrinsic::invariant_start:
4019 Assert(isa<ConstantInt>(CS.getArgOperand(0)),do { if (!(isa<ConstantInt>(CS.getArgOperand(0)))) { CheckFailed
("size argument of memory use markers must be a constant integer"
, CS); return; } } while (0)
4020 "size argument of memory use markers must be a constant integer",do { if (!(isa<ConstantInt>(CS.getArgOperand(0)))) { CheckFailed
("size argument of memory use markers must be a constant integer"
, CS); return; } } while (0)
4021 CS)do { if (!(isa<ConstantInt>(CS.getArgOperand(0)))) { CheckFailed
("size argument of memory use markers must be a constant integer"
, CS); return; } } while (0)
;
4022 break;
4023 case Intrinsic::invariant_end:
4024 Assert(isa<ConstantInt>(CS.getArgOperand(1)),do { if (!(isa<ConstantInt>(CS.getArgOperand(1)))) { CheckFailed
("llvm.invariant.end parameter #2 must be a constant integer"
, CS); return; } } while (0)
4025 "llvm.invariant.end parameter #2 must be a constant integer", CS)do { if (!(isa<ConstantInt>(CS.getArgOperand(1)))) { CheckFailed
("llvm.invariant.end parameter #2 must be a constant integer"
, CS); return; } } while (0)
;
4026 break;
4027
4028 case Intrinsic::localescape: {
4029 BasicBlock *BB = CS.getParent();
4030 Assert(BB == &BB->getParent()->front(),do { if (!(BB == &BB->getParent()->front())) { CheckFailed
("llvm.localescape used outside of entry block", CS); return;
} } while (0)
4031 "llvm.localescape used outside of entry block", CS)do { if (!(BB == &BB->getParent()->front())) { CheckFailed
("llvm.localescape used outside of entry block", CS); return;
} } while (0)
;
4032 Assert(!SawFrameEscape,do { if (!(!SawFrameEscape)) { CheckFailed("multiple calls to llvm.localescape in one function"
, CS); return; } } while (0)
4033 "multiple calls to llvm.localescape in one function", CS)do { if (!(!SawFrameEscape)) { CheckFailed("multiple calls to llvm.localescape in one function"
, CS); return; } } while (0)
;
4034 for (Value *Arg : CS.args()) {
4035 if (isa<ConstantPointerNull>(Arg))
4036 continue; // Null values are allowed as placeholders.
4037 auto *AI = dyn_cast<AllocaInst>(Arg->stripPointerCasts());
4038 Assert(AI && AI->isStaticAlloca(),do { if (!(AI && AI->isStaticAlloca())) { CheckFailed
("llvm.localescape only accepts static allocas", CS); return;
} } while (0)
4039 "llvm.localescape only accepts static allocas", CS)do { if (!(AI && AI->isStaticAlloca())) { CheckFailed
("llvm.localescape only accepts static allocas", CS); return;
} } while (0)
;
4040 }
4041 FrameEscapeInfo[BB->getParent()].first = CS.getNumArgOperands();
4042 SawFrameEscape = true;
4043 break;
4044 }
4045 case Intrinsic::localrecover: {
4046 Value *FnArg = CS.getArgOperand(0)->stripPointerCasts();
4047 Function *Fn = dyn_cast<Function>(FnArg);
4048 Assert(Fn && !Fn->isDeclaration(),do { if (!(Fn && !Fn->isDeclaration())) { CheckFailed
("llvm.localrecover first " "argument must be function defined in this module"
, CS); return; } } while (0)
4049 "llvm.localrecover first "do { if (!(Fn && !Fn->isDeclaration())) { CheckFailed
("llvm.localrecover first " "argument must be function defined in this module"
, CS); return; } } while (0)
4050 "argument must be function defined in this module",do { if (!(Fn && !Fn->isDeclaration())) { CheckFailed
("llvm.localrecover first " "argument must be function defined in this module"
, CS); return; } } while (0)
4051 CS)do { if (!(Fn && !Fn->isDeclaration())) { CheckFailed
("llvm.localrecover first " "argument must be function defined in this module"
, CS); return; } } while (0)
;
4052 auto *IdxArg = dyn_cast<ConstantInt>(CS.getArgOperand(2));
4053 Assert(IdxArg, "idx argument of llvm.localrecover must be a constant int",do { if (!(IdxArg)) { CheckFailed("idx argument of llvm.localrecover must be a constant int"
, CS); return; } } while (0)
4054 CS)do { if (!(IdxArg)) { CheckFailed("idx argument of llvm.localrecover must be a constant int"
, CS); return; } } while (0)
;
4055 auto &Entry = FrameEscapeInfo[Fn];
4056 Entry.second = unsigned(
4057 std::max(uint64_t(Entry.second), IdxArg->getLimitedValue(~0U) + 1));
4058 break;
4059 }
4060
4061 case Intrinsic::experimental_gc_statepoint:
4062 Assert(!CS.isInlineAsm(),do { if (!(!CS.isInlineAsm())) { CheckFailed("gc.statepoint support for inline assembly unimplemented"
, CS); return; } } while (0)
4063 "gc.statepoint support for inline assembly unimplemented", CS)do { if (!(!CS.isInlineAsm())) { CheckFailed("gc.statepoint support for inline assembly unimplemented"
, CS); return; } } while (0)
;
4064 Assert(CS.getParent()->getParent()->hasGC(),do { if (!(CS.getParent()->getParent()->hasGC())) { CheckFailed
("Enclosing function does not use GC.", CS); return; } } while
(0)
4065 "Enclosing function does not use GC.", CS)do { if (!(CS.getParent()->getParent()->hasGC())) { CheckFailed
("Enclosing function does not use GC.", CS); return; } } while
(0)
;
4066
4067 verifyStatepoint(CS);
4068 break;
4069 case Intrinsic::experimental_gc_result: {
4070 Assert(CS.getParent()->getParent()->hasGC(),do { if (!(CS.getParent()->getParent()->hasGC())) { CheckFailed
("Enclosing function does not use GC.", CS); return; } } while
(0)
4071 "Enclosing function does not use GC.", CS)do { if (!(CS.getParent()->getParent()->hasGC())) { CheckFailed
("Enclosing function does not use GC.", CS); return; } } while
(0)
;
4072 // Are we tied to a statepoint properly?
4073 CallSite StatepointCS(CS.getArgOperand(0));
4074 const Function *StatepointFn =
4075 StatepointCS.getInstruction() ? StatepointCS.getCalledFunction() : nullptr;
4076 Assert(StatepointFn && StatepointFn->isDeclaration() &&do { if (!(StatepointFn && StatepointFn->isDeclaration
() && StatepointFn->getIntrinsicID() == Intrinsic::
experimental_gc_statepoint)) { CheckFailed("gc.result operand #1 must be from a statepoint"
, CS, CS.getArgOperand(0)); return; } } while (0)
4077 StatepointFn->getIntrinsicID() ==do { if (!(StatepointFn && StatepointFn->isDeclaration
() && StatepointFn->getIntrinsicID() == Intrinsic::
experimental_gc_statepoint)) { CheckFailed("gc.result operand #1 must be from a statepoint"
, CS, CS.getArgOperand(0)); return; } } while (0)
4078 Intrinsic::experimental_gc_statepoint,do { if (!(StatepointFn && StatepointFn->isDeclaration
() && StatepointFn->getIntrinsicID() == Intrinsic::
experimental_gc_statepoint)) { CheckFailed("gc.result operand #1 must be from a statepoint"
, CS, CS.getArgOperand(0)); return; } } while (0)
4079 "gc.result operand #1 must be from a statepoint", CS,do { if (!(StatepointFn && StatepointFn->isDeclaration
() && StatepointFn->getIntrinsicID() == Intrinsic::
experimental_gc_statepoint)) { CheckFailed("gc.result operand #1 must be from a statepoint"
, CS, CS.getArgOperand(0)); return; } } while (0)
4080 CS.getArgOperand(0))do { if (!(StatepointFn && StatepointFn->isDeclaration
() && StatepointFn->getIntrinsicID() == Intrinsic::
experimental_gc_statepoint)) { CheckFailed("gc.result operand #1 must be from a statepoint"
, CS, CS.getArgOperand(0)); return; } } while (0)
;
4081
4082 // Assert that result type matches wrapped callee.
4083 const Value *Target = StatepointCS.getArgument(2);
4084 auto *PT = cast<PointerType>(Target->getType());
4085 auto *TargetFuncType = cast<FunctionType>(PT->getElementType());
4086 Assert(CS.getType() == TargetFuncType->getReturnType(),do { if (!(CS.getType() == TargetFuncType->getReturnType()
)) { CheckFailed("gc.result result type does not match wrapped callee"
, CS); return; } } while (0)
4087 "gc.result result type does not match wrapped callee", CS)do { if (!(CS.getType() == TargetFuncType->getReturnType()
)) { CheckFailed("gc.result result type does not match wrapped callee"
, CS); return; } } while (0)
;
4088 break;
4089 }
4090 case Intrinsic::experimental_gc_relocate: {
4091 Assert(CS.getNumArgOperands() == 3, "wrong number of arguments", CS)do { if (!(CS.getNumArgOperands() == 3)) { CheckFailed("wrong number of arguments"
, CS); return; } } while (0)
;
4092
4093 Assert(isa<PointerType>(CS.getType()->getScalarType()),do { if (!(isa<PointerType>(CS.getType()->getScalarType
()))) { CheckFailed("gc.relocate must return a pointer or a vector of pointers"
, CS); return; } } while (0)
4094 "gc.relocate must return a pointer or a vector of pointers", CS)do { if (!(isa<PointerType>(CS.getType()->getScalarType
()))) { CheckFailed("gc.relocate must return a pointer or a vector of pointers"
, CS); return; } } while (0)
;
4095
4096 // Check that this relocate is correctly tied to the statepoint
4097
4098 // This is case for relocate on the unwinding path of an invoke statepoint
4099 if (LandingPadInst *LandingPad =
4100 dyn_cast<LandingPadInst>(CS.getArgOperand(0))) {
4101
4102 const BasicBlock *InvokeBB =
4103 LandingPad->getParent()->getUniquePredecessor();
4104
4105 // Landingpad relocates should have only one predecessor with invoke
4106 // statepoint terminator
4107 Assert(InvokeBB, "safepoints should have unique landingpads",do { if (!(InvokeBB)) { CheckFailed("safepoints should have unique landingpads"
, LandingPad->getParent()); return; } } while (0)
4108 LandingPad->getParent())do { if (!(InvokeBB)) { CheckFailed("safepoints should have unique landingpads"
, LandingPad->getParent()); return; } } while (0)
;
4109 Assert(InvokeBB->getTerminator(), "safepoint block should be well formed",do { if (!(InvokeBB->getTerminator())) { CheckFailed("safepoint block should be well formed"
, InvokeBB); return; } } while (0)
4110 InvokeBB)do { if (!(InvokeBB->getTerminator())) { CheckFailed("safepoint block should be well formed"
, InvokeBB); return; } } while (0)
;
4111 Assert(isStatepoint(InvokeBB->getTerminator()),do { if (!(isStatepoint(InvokeBB->getTerminator()))) { CheckFailed
("gc relocate should be linked to a statepoint", InvokeBB); return
; } } while (0)
4112 "gc relocate should be linked to a statepoint", InvokeBB)do { if (!(isStatepoint(InvokeBB->getTerminator()))) { CheckFailed
("gc relocate should be linked to a statepoint", InvokeBB); return
; } } while (0)
;
4113 }
4114 else {
4115 // In all other cases relocate should be tied to the statepoint directly.
4116 // This covers relocates on a normal return path of invoke statepoint and
4117 // relocates of a call statepoint.
4118 auto Token = CS.getArgOperand(0);
4119 Assert(isa<Instruction>(Token) && isStatepoint(cast<Instruction>(Token)),do { if (!(isa<Instruction>(Token) && isStatepoint
(cast<Instruction>(Token)))) { CheckFailed("gc relocate is incorrectly tied to the statepoint"
, CS, Token); return; } } while (0)
4120 "gc relocate is incorrectly tied to the statepoint", CS, Token)do { if (!(isa<Instruction>(Token) && isStatepoint
(cast<Instruction>(Token)))) { CheckFailed("gc relocate is incorrectly tied to the statepoint"
, CS, Token); return; } } while (0)
;
4121 }
4122
4123 // Verify rest of the relocate arguments.
4124
4125 ImmutableCallSite StatepointCS(
4126 cast<GCRelocateInst>(*CS.getInstruction()).getStatepoint());
4127
4128 // Both the base and derived must be piped through the safepoint.
4129 Value* Base = CS.getArgOperand(1);
4130 Assert(isa<ConstantInt>(Base),do { if (!(isa<ConstantInt>(Base))) { CheckFailed("gc.relocate operand #2 must be integer offset"
, CS); return; } } while (0)
4131 "gc.relocate operand #2 must be integer offset", CS)do { if (!(isa<ConstantInt>(Base))) { CheckFailed("gc.relocate operand #2 must be integer offset"
, CS); return; } } while (0)
;
4132
4133 Value* Derived = CS.getArgOperand(2);
4134 Assert(isa<ConstantInt>(Derived),do { if (!(isa<ConstantInt>(Derived))) { CheckFailed("gc.relocate operand #3 must be integer offset"
, CS); return; } } while (0)
4135 "gc.relocate operand #3 must be integer offset", CS)do { if (!(isa<ConstantInt>(Derived))) { CheckFailed("gc.relocate operand #3 must be integer offset"
, CS); return; } } while (0)
;
4136
4137 const int BaseIndex = cast<ConstantInt>(Base)->getZExtValue();
4138 const int DerivedIndex = cast<ConstantInt>(Derived)->getZExtValue();
4139 // Check the bounds
4140 Assert(0 <= BaseIndex && BaseIndex < (int)StatepointCS.arg_size(),do { if (!(0 <= BaseIndex && BaseIndex < (int)StatepointCS
.arg_size())) { CheckFailed("gc.relocate: statepoint base index out of bounds"
, CS); return; } } while (0)
4141 "gc.relocate: statepoint base index out of bounds", CS)do { if (!(0 <= BaseIndex && BaseIndex < (int)StatepointCS
.arg_size())) { CheckFailed("gc.relocate: statepoint base index out of bounds"
, CS); return; } } while (0)
;
4142 Assert(0 <= DerivedIndex && DerivedIndex < (int)StatepointCS.arg_size(),do { if (!(0 <= DerivedIndex && DerivedIndex < (
int)StatepointCS.arg_size())) { CheckFailed("gc.relocate: statepoint derived index out of bounds"
, CS); return; } } while (0)
4143 "gc.relocate: statepoint derived index out of bounds", CS)do { if (!(0 <= DerivedIndex && DerivedIndex < (
int)StatepointCS.arg_size())) { CheckFailed("gc.relocate: statepoint derived index out of bounds"
, CS); return; } } while (0)
;
4144
4145 // Check that BaseIndex and DerivedIndex fall within the 'gc parameters'
4146 // section of the statepoint's argument.
4147 Assert(StatepointCS.arg_size() > 0,do { if (!(StatepointCS.arg_size() > 0)) { CheckFailed("gc.statepoint: insufficient arguments"
); return; } } while (0)
4148 "gc.statepoint: insufficient arguments")do { if (!(StatepointCS.arg_size() > 0)) { CheckFailed("gc.statepoint: insufficient arguments"
); return; } } while (0)
;
4149 Assert(isa<ConstantInt>(StatepointCS.getArgument(3)),do { if (!(isa<ConstantInt>(StatepointCS.getArgument(3)
))) { CheckFailed("gc.statement: number of call arguments must be constant integer"
); return; } } while (0)
4150 "gc.statement: number of call arguments must be constant integer")do { if (!(isa<ConstantInt>(StatepointCS.getArgument(3)
))) { CheckFailed("gc.statement: number of call arguments must be constant integer"
); return; } } while (0)
;
4151 const unsigned NumCallArgs =
4152 cast<ConstantInt>(StatepointCS.getArgument(3))->getZExtValue();
4153 Assert(StatepointCS.arg_size() > NumCallArgs + 5,do { if (!(StatepointCS.arg_size() > NumCallArgs + 5)) { CheckFailed
("gc.statepoint: mismatch in number of call arguments"); return
; } } while (0)
4154 "gc.statepoint: mismatch in number of call arguments")do { if (!(StatepointCS.arg_size() > NumCallArgs + 5)) { CheckFailed
("gc.statepoint: mismatch in number of call arguments"); return
; } } while (0)
;
4155 Assert(isa<ConstantInt>(StatepointCS.getArgument(NumCallArgs + 5)),do { if (!(isa<ConstantInt>(StatepointCS.getArgument(NumCallArgs
+ 5)))) { CheckFailed("gc.statepoint: number of transition arguments must be "
"a constant integer"); return; } } while (0)
4156 "gc.statepoint: number of transition arguments must be "do { if (!(isa<ConstantInt>(StatepointCS.getArgument(NumCallArgs
+ 5)))) { CheckFailed("gc.statepoint: number of transition arguments must be "
"a constant integer"); return; } } while (0)
4157 "a constant integer")do { if (!(isa<ConstantInt>(StatepointCS.getArgument(NumCallArgs
+ 5)))) { CheckFailed("gc.statepoint: number of transition arguments must be "
"a constant integer"); return; } } while (0)
;
4158 const int NumTransitionArgs =
4159 cast<ConstantInt>(StatepointCS.getArgument(NumCallArgs + 5))
4160 ->getZExtValue();
4161 const int DeoptArgsStart = 4 + NumCallArgs + 1 + NumTransitionArgs + 1;
4162 Assert(isa<ConstantInt>(StatepointCS.getArgument(DeoptArgsStart)),do { if (!(isa<ConstantInt>(StatepointCS.getArgument(DeoptArgsStart
)))) { CheckFailed("gc.statepoint: number of deoptimization arguments must be "
"a constant integer"); return; } } while (0)
4163 "gc.statepoint: number of deoptimization arguments must be "do { if (!(isa<ConstantInt>(StatepointCS.getArgument(DeoptArgsStart
)))) { CheckFailed("gc.statepoint: number of deoptimization arguments must be "
"a constant integer"); return; } } while (0)
4164 "a constant integer")do { if (!(isa<ConstantInt>(StatepointCS.getArgument(DeoptArgsStart
)))) { CheckFailed("gc.statepoint: number of deoptimization arguments must be "
"a constant integer"); return; } } while (0)
;
4165 const int NumDeoptArgs =
4166 cast<ConstantInt>(StatepointCS.getArgument(DeoptArgsStart))
4167 ->getZExtValue();
4168 const int GCParamArgsStart = DeoptArgsStart + 1 + NumDeoptArgs;
4169 const int GCParamArgsEnd = StatepointCS.arg_size();
4170 Assert(GCParamArgsStart <= BaseIndex && BaseIndex < GCParamArgsEnd,do { if (!(GCParamArgsStart <= BaseIndex && BaseIndex
< GCParamArgsEnd)) { CheckFailed("gc.relocate: statepoint base index doesn't fall within the "
"'gc parameters' section of the statepoint call", CS); return
; } } while (0)
4171 "gc.relocate: statepoint base index doesn't fall within the "do { if (!(GCParamArgsStart <= BaseIndex && BaseIndex
< GCParamArgsEnd)) { CheckFailed("gc.relocate: statepoint base index doesn't fall within the "
"'gc parameters' section of the statepoint call", CS); return
; } } while (0)
4172 "'gc parameters' section of the statepoint call",do { if (!(GCParamArgsStart <= BaseIndex && BaseIndex
< GCParamArgsEnd)) { CheckFailed("gc.relocate: statepoint base index doesn't fall within the "
"'gc parameters' section of the statepoint call", CS); return
; } } while (0)
4173 CS)do { if (!(GCParamArgsStart <= BaseIndex && BaseIndex
< GCParamArgsEnd)) { CheckFailed("gc.relocate: statepoint base index doesn't fall within the "
"'gc parameters' section of the statepoint call", CS); return
; } } while (0)
;
4174 Assert(GCParamArgsStart <= DerivedIndex && DerivedIndex < GCParamArgsEnd,do { if (!(GCParamArgsStart <= DerivedIndex && DerivedIndex
< GCParamArgsEnd)) { CheckFailed("gc.relocate: statepoint derived index doesn't fall within the "
"'gc parameters' section of the statepoint call", CS); return
; } } while (0)
4175 "gc.relocate: statepoint derived index doesn't fall within the "do { if (!(GCParamArgsStart <= DerivedIndex && DerivedIndex
< GCParamArgsEnd)) { CheckFailed("gc.relocate: statepoint derived index doesn't fall within the "
"'gc parameters' section of the statepoint call", CS); return
; } } while (0)
4176 "'gc parameters' section of the statepoint call",do { if (!(GCParamArgsStart <= DerivedIndex && DerivedIndex
< GCParamArgsEnd)) { CheckFailed("gc.relocate: statepoint derived index doesn't fall within the "
"'gc parameters' section of the statepoint call", CS); return
; } } while (0)
4177 CS)do { if (!(GCParamArgsStart <= DerivedIndex && DerivedIndex
< GCParamArgsEnd)) { CheckFailed("gc.relocate: statepoint derived index doesn't fall within the "
"'gc parameters' section of the statepoint call", CS); return
; } } while (0)
;
4178
4179 // Relocated value must be either a pointer type or vector-of-pointer type,
4180 // but gc_relocate does not need to return the same pointer type as the
4181 // relocated pointer. It can be casted to the correct type later if it's
4182 // desired. However, they must have the same address space and 'vectorness'
4183 GCRelocateInst &Relocate = cast<GCRelocateInst>(*CS.getInstruction());
4184 Assert(Relocate.getDerivedPtr()->getType()->getScalarType()->isPointerTy(),do { if (!(Relocate.getDerivedPtr()->getType()->getScalarType
()->isPointerTy())) { CheckFailed("gc.relocate: relocated value must be a gc pointer"
, CS); return; } } while (0)
4185 "gc.relocate: relocated value must be a gc pointer", CS)do { if (!(Relocate.getDerivedPtr()->getType()->getScalarType
()->isPointerTy())) { CheckFailed("gc.relocate: relocated value must be a gc pointer"
, CS); return; } } while (0)
;
4186
4187 auto ResultType = CS.getType();
4188 auto DerivedType = Relocate.getDerivedPtr()->getType();
4189 Assert(ResultType->isVectorTy() == DerivedType->isVectorTy(),do { if (!(ResultType->isVectorTy() == DerivedType->isVectorTy
())) { CheckFailed("gc.relocate: vector relocates to vector and pointer to pointer"
, CS); return; } } while (0)
4190 "gc.relocate: vector relocates to vector and pointer to pointer",do { if (!(ResultType->isVectorTy() == DerivedType->isVectorTy
())) { CheckFailed("gc.relocate: vector relocates to vector and pointer to pointer"
, CS); return; } } while (0)
4191 CS)do { if (!(ResultType->isVectorTy() == DerivedType->isVectorTy
())) { CheckFailed("gc.relocate: vector relocates to vector and pointer to pointer"
, CS); return; } } while (0)
;
4192 Assert(do { if (!(ResultType->getPointerAddressSpace() == DerivedType
->getPointerAddressSpace())) { CheckFailed("gc.relocate: relocating a pointer shouldn't change its address space"
, CS); return; } } while (0)
4193 ResultType->getPointerAddressSpace() ==do { if (!(ResultType->getPointerAddressSpace() == DerivedType
->getPointerAddressSpace())) { CheckFailed("gc.relocate: relocating a pointer shouldn't change its address space"
, CS); return; } } while (0)
4194 DerivedType->getPointerAddressSpace(),do { if (!(ResultType->getPointerAddressSpace() == DerivedType
->getPointerAddressSpace())) { CheckFailed("gc.relocate: relocating a pointer shouldn't change its address space"
, CS); return; } } while (0)
4195 "gc.relocate: relocating a pointer shouldn't change its address space",do { if (!(ResultType->getPointerAddressSpace() == DerivedType
->getPointerAddressSpace())) { CheckFailed("gc.relocate: relocating a pointer shouldn't change its address space"
, CS); return; } } while (0)
4196 CS)do { if (!(ResultType->getPointerAddressSpace() == DerivedType
->getPointerAddressSpace())) { CheckFailed("gc.relocate: relocating a pointer shouldn't change its address space"
, CS); return; } } while (0)
;
4197 break;
4198 }
4199 case Intrinsic::eh_exceptioncode:
4200 case Intrinsic::eh_exceptionpointer: {
4201 Assert(isa<CatchPadInst>(CS.getArgOperand(0)),do { if (!(isa<CatchPadInst>(CS.getArgOperand(0)))) { CheckFailed
("eh.exceptionpointer argument must be a catchpad", CS); return
; } } while (0)
4202 "eh.exceptionpointer argument must be a catchpad", CS)do { if (!(isa<CatchPadInst>(CS.getArgOperand(0)))) { CheckFailed
("eh.exceptionpointer argument must be a catchpad", CS); return
; } } while (0)
;
4203 break;
4204 }
4205 case Intrinsic::masked_load: {
4206 Assert(CS.getType()->isVectorTy(), "masked_load: must return a vector", CS)do { if (!(CS.getType()->isVectorTy())) { CheckFailed("masked_load: must return a vector"
, CS); return; } } while (0)
;
4207
4208 Value *Ptr = CS.getArgOperand(0);
4209 //Value *Alignment = CS.getArgOperand(1);
4210 Value *Mask = CS.getArgOperand(2);
4211 Value *PassThru = CS.getArgOperand(3);
4212 Assert(Mask->getType()->isVectorTy(),do { if (!(Mask->getType()->isVectorTy())) { CheckFailed
("masked_load: mask must be vector", CS); return; } } while (
0)
4213 "masked_load: mask must be vector", CS)do { if (!(Mask->getType()->isVectorTy())) { CheckFailed
("masked_load: mask must be vector", CS); return; } } while (
0)
;
4214
4215 // DataTy is the overloaded type
4216 Type *DataTy = cast<PointerType>(Ptr->getType())->getElementType();
4217 Assert(DataTy == CS.getType(),do { if (!(DataTy == CS.getType())) { CheckFailed("masked_load: return must match pointer type"
, CS); return; } } while (0)
4218 "masked_load: return must match pointer type", CS)do { if (!(DataTy == CS.getType())) { CheckFailed("masked_load: return must match pointer type"
, CS); return; } } while (0)
;
4219 Assert(PassThru->getType() == DataTy,do { if (!(PassThru->getType() == DataTy)) { CheckFailed("masked_load: pass through and data type must match"
, CS); return; } } while (0)
4220 "masked_load: pass through and data type must match", CS)do { if (!(PassThru->getType() == DataTy)) { CheckFailed("masked_load: pass through and data type must match"
, CS); return; } } while (0)
;
4221 Assert(Mask->getType()->getVectorNumElements() ==do { if (!(Mask->getType()->getVectorNumElements() == DataTy
->getVectorNumElements())) { CheckFailed("masked_load: vector mask must be same length as data"
, CS); return; } } while (0)
4222 DataTy->getVectorNumElements(),do { if (!(Mask->getType()->getVectorNumElements() == DataTy
->getVectorNumElements())) { CheckFailed("masked_load: vector mask must be same length as data"
, CS); return; } } while (0)
4223 "masked_load: vector mask must be same length as data", CS)do { if (!(Mask->getType()->getVectorNumElements() == DataTy
->getVectorNumElements())) { CheckFailed("masked_load: vector mask must be same length as data"
, CS); return; } } while (0)
;
4224 break;
4225 }
4226 case Intrinsic::masked_store: {
4227 Value *Val = CS.getArgOperand(0);
4228 Value *Ptr = CS.getArgOperand(1);
4229 //Value *Alignment = CS.getArgOperand(2);
4230 Value *Mask = CS.getArgOperand(3);
4231 Assert(Mask->getType()->isVectorTy(),do { if (!(Mask->getType()->isVectorTy())) { CheckFailed
("masked_store: mask must be vector", CS); return; } } while (
0)
4232 "masked_store: mask must be vector", CS)do { if (!(Mask->getType()->isVectorTy())) { CheckFailed
("masked_store: mask must be vector", CS); return; } } while (
0)
;
4233
4234 // DataTy is the overloaded type
4235 Type *DataTy = cast<PointerType>(Ptr->getType())->getElementType();
4236 Assert(DataTy == Val->getType(),do { if (!(DataTy == Val->getType())) { CheckFailed("masked_store: storee must match pointer type"
, CS); return; } } while (0)
4237 "masked_store: storee must match pointer type", CS)do { if (!(DataTy == Val->getType())) { CheckFailed("masked_store: storee must match pointer type"
, CS); return; } } while (0)
;
4238 Assert(Mask->getType()->getVectorNumElements() ==do { if (!(Mask->getType()->getVectorNumElements() == DataTy
->getVectorNumElements())) { CheckFailed("masked_store: vector mask must be same length as data"
, CS); return; } } while (0)
4239 DataTy->getVectorNumElements(),do { if (!(Mask->getType()->getVectorNumElements() == DataTy
->getVectorNumElements())) { CheckFailed("masked_store: vector mask must be same length as data"
, CS); return; } } while (0)
4240 "masked_store: vector mask must be same length as data", CS)do { if (!(Mask->getType()->getVectorNumElements() == DataTy
->getVectorNumElements())) { CheckFailed("masked_store: vector mask must be same length as data"
, CS); return; } } while (0)
;
4241 break;
4242 }
4243
4244 case Intrinsic::experimental_guard: {
4245 Assert(CS.isCall(), "experimental_guard cannot be invoked", CS)do { if (!(CS.isCall())) { CheckFailed("experimental_guard cannot be invoked"
, CS); return; } } while (0)
;
4246 Assert(CS.countOperandBundlesOfType(LLVMContext::OB_deopt) == 1,do { if (!(CS.countOperandBundlesOfType(LLVMContext::OB_deopt
) == 1)) { CheckFailed("experimental_guard must have exactly one "
"\"deopt\" operand bundle"); return; } } while (0)
4247 "experimental_guard must have exactly one "do { if (!(CS.countOperandBundlesOfType(LLVMContext::OB_deopt
) == 1)) { CheckFailed("experimental_guard must have exactly one "
"\"deopt\" operand bundle"); return; } } while (0)
4248 "\"deopt\" operand bundle")do { if (!(CS.countOperandBundlesOfType(LLVMContext::OB_deopt
) == 1)) { CheckFailed("experimental_guard must have exactly one "
"\"deopt\" operand bundle"); return; } } while (0)
;
4249 break;
4250 }
4251
4252 case Intrinsic::experimental_deoptimize: {
4253 Assert(CS.isCall(), "experimental_deoptimize cannot be invoked", CS)do { if (!(CS.isCall())) { CheckFailed("experimental_deoptimize cannot be invoked"
, CS); return; } } while (0)
;
4254 Assert(CS.countOperandBundlesOfType(LLVMContext::OB_deopt) == 1,do { if (!(CS.countOperandBundlesOfType(LLVMContext::OB_deopt
) == 1)) { CheckFailed("experimental_deoptimize must have exactly one "
"\"deopt\" operand bundle"); return; } } while (0)
4255 "experimental_deoptimize must have exactly one "do { if (!(CS.countOperandBundlesOfType(LLVMContext::OB_deopt
) == 1)) { CheckFailed("experimental_deoptimize must have exactly one "
"\"deopt\" operand bundle"); return; } } while (0)
4256 "\"deopt\" operand bundle")do { if (!(CS.countOperandBundlesOfType(LLVMContext::OB_deopt
) == 1)) { CheckFailed("experimental_deoptimize must have exactly one "
"\"deopt\" operand bundle"); return; } } while (0)
;
4257 Assert(CS.getType() == CS.getInstruction()->getFunction()->getReturnType(),do { if (!(CS.getType() == CS.getInstruction()->getFunction
()->getReturnType())) { CheckFailed("experimental_deoptimize return type must match caller return type"
); return; } } while (0)
4258 "experimental_deoptimize return type must match caller return type")do { if (!(CS.getType() == CS.getInstruction()->getFunction
()->getReturnType())) { CheckFailed("experimental_deoptimize return type must match caller return type"
); return; } } while (0)
;
4259
4260 if (CS.isCall()) {
4261 auto *DeoptCI = CS.getInstruction();
4262 auto *RI = dyn_cast<ReturnInst>(DeoptCI->getNextNode());
4263 Assert(RI,do { if (!(RI)) { CheckFailed("calls to experimental_deoptimize must be followed by a return"
); return; } } while (0)
4264 "calls to experimental_deoptimize must be followed by a return")do { if (!(RI)) { CheckFailed("calls to experimental_deoptimize must be followed by a return"
); return; } } while (0)
;
4265
4266 if (!CS.getType()->isVoidTy() && RI)
4267 Assert(RI->getReturnValue() == DeoptCI,do { if (!(RI->getReturnValue() == DeoptCI)) { CheckFailed
("calls to experimental_deoptimize must be followed by a return "
"of the value computed by experimental_deoptimize"); return;
} } while (0)
4268 "calls to experimental_deoptimize must be followed by a return "do { if (!(RI->getReturnValue() == DeoptCI)) { CheckFailed
("calls to experimental_deoptimize must be followed by a return "
"of the value computed by experimental_deoptimize"); return;
} } while (0)
4269 "of the value computed by experimental_deoptimize")do { if (!(RI->getReturnValue() == DeoptCI)) { CheckFailed
("calls to experimental_deoptimize must be followed by a return "
"of the value computed by experimental_deoptimize"); return;
} } while (0)
;
4270 }
4271
4272 break;
4273 }
4274 };
4275}
4276
4277/// \brief Carefully grab the subprogram from a local scope.
4278///
4279/// This carefully grabs the subprogram from a local scope, avoiding the
4280/// built-in assertions that would typically fire.
4281static DISubprogram *getSubprogram(Metadata *LocalScope) {
4282 if (!LocalScope)
4283 return nullptr;
4284
4285 if (auto *SP = dyn_cast<DISubprogram>(LocalScope))
4286 return SP;
4287
4288 if (auto *LB = dyn_cast<DILexicalBlockBase>(LocalScope))
4289 return getSubprogram(LB->getRawScope());
4290
4291 // Just return null; broken scope chains are checked elsewhere.
4292 assert(!isa<DILocalScope>(LocalScope) && "Unknown type of local scope")((!isa<DILocalScope>(LocalScope) && "Unknown type of local scope"
) ? static_cast<void> (0) : __assert_fail ("!isa<DILocalScope>(LocalScope) && \"Unknown type of local scope\""
, "/tmp/buildd/llvm-toolchain-snapshot-3.9~svn271203/lib/IR/Verifier.cpp"
, 4292, __PRETTY_FUNCTION__))
;
4293 return nullptr;
4294}
4295
4296template <class DbgIntrinsicTy>
4297void Verifier::visitDbgIntrinsic(StringRef Kind, DbgIntrinsicTy &DII) {
4298 auto *MD = cast<MetadataAsValue>(DII.getArgOperand(0))->getMetadata();
4299 AssertDI(isa<ValueAsMetadata>(MD) ||do { if (!(isa<ValueAsMetadata>(MD) || (isa<MDNode>
(MD) && !cast<MDNode>(MD)->getNumOperands())
)) { DebugInfoCheckFailed("invalid llvm.dbg." + Kind + " intrinsic address/value"
, &DII, MD); return; } } while (0)
4300 (isa<MDNode>(MD) && !cast<MDNode>(MD)->getNumOperands()),do { if (!(isa<ValueAsMetadata>(MD) || (isa<MDNode>
(MD) && !cast<MDNode>(MD)->getNumOperands())
)) { DebugInfoCheckFailed("invalid llvm.dbg." + Kind + " intrinsic address/value"
, &DII, MD); return; } } while (0)
4301 "invalid llvm.dbg." + Kind + " intrinsic address/value", &DII, MD)do { if (!(isa<ValueAsMetadata>(MD) || (isa<MDNode>
(MD) && !cast<MDNode>(MD)->getNumOperands())
)) { DebugInfoCheckFailed("invalid llvm.dbg." + Kind + " intrinsic address/value"
, &DII, MD); return; } } while (0)
;
4302 AssertDI(isa<DILocalVariable>(DII.getRawVariable()),do { if (!(isa<DILocalVariable>(DII.getRawVariable())))
{ DebugInfoCheckFailed("invalid llvm.dbg." + Kind + " intrinsic variable"
, &DII, DII.getRawVariable()); return; } } while (0)
4303 "invalid llvm.dbg." + Kind + " intrinsic variable", &DII,do { if (!(isa<DILocalVariable>(DII.getRawVariable())))
{ DebugInfoCheckFailed("invalid llvm.dbg." + Kind + " intrinsic variable"
, &DII, DII.getRawVariable()); return; } } while (0)
4304 DII.getRawVariable())do { if (!(isa<DILocalVariable>(DII.getRawVariable())))
{ DebugInfoCheckFailed("invalid llvm.dbg." + Kind + " intrinsic variable"
, &DII, DII.getRawVariable()); return; } } while (0)
;
4305 AssertDI(isa<DIExpression>(DII.getRawExpression()),do { if (!(isa<DIExpression>(DII.getRawExpression()))) {
DebugInfoCheckFailed("invalid llvm.dbg." + Kind + " intrinsic expression"
, &DII, DII.getRawExpression()); return; } } while (0)
4306 "invalid llvm.dbg." + Kind + " intrinsic expression", &DII,do { if (!(isa<DIExpression>(DII.getRawExpression()))) {
DebugInfoCheckFailed("invalid llvm.dbg." + Kind + " intrinsic expression"
, &DII, DII.getRawExpression()); return; } } while (0)
4307 DII.getRawExpression())do { if (!(isa<DIExpression>(DII.getRawExpression()))) {
DebugInfoCheckFailed("invalid llvm.dbg." + Kind + " intrinsic expression"
, &DII, DII.getRawExpression()); return; } } while (0)
;
4308
4309 // Ignore broken !dbg attachments; they're checked elsewhere.
4310 if (MDNode *N = DII.getDebugLoc().getAsMDNode())
4311 if (!isa<DILocation>(N))
4312 return;
4313
4314 BasicBlock *BB = DII.getParent();
4315 Function *F = BB ? BB->getParent() : nullptr;
4316
4317 // The scopes for variables and !dbg attachments must agree.
4318 DILocalVariable *Var = DII.getVariable();
4319 DILocation *Loc = DII.getDebugLoc();
4320 Assert(Loc, "llvm.dbg." + Kind + " intrinsic requires a !dbg attachment",do { if (!(Loc)) { CheckFailed("llvm.dbg." + Kind + " intrinsic requires a !dbg attachment"
, &DII, BB, F); return; } } while (0)
4321 &DII, BB, F)do { if (!(Loc)) { CheckFailed("llvm.dbg." + Kind + " intrinsic requires a !dbg attachment"
, &DII, BB, F); return; } } while (0)
;
4322
4323 DISubprogram *VarSP = getSubprogram(Var->getRawScope());
4324 DISubprogram *LocSP = getSubprogram(Loc->getRawScope());
4325 if (!VarSP || !LocSP)
4326 return; // Broken scope chains are checked elsewhere.
4327
4328 Assert(VarSP == LocSP, "mismatched subprogram between llvm.dbg." + Kind +do { if (!(VarSP == LocSP)) { CheckFailed("mismatched subprogram between llvm.dbg."
+ Kind + " variable and !dbg attachment", &DII, BB, F, Var
, Var->getScope()->getSubprogram(), Loc, Loc->getScope
()->getSubprogram()); return; } } while (0)
4329 " variable and !dbg attachment",do { if (!(VarSP == LocSP)) { CheckFailed("mismatched subprogram between llvm.dbg."
+ Kind + " variable and !dbg attachment", &DII, BB, F, Var
, Var->getScope()->getSubprogram(), Loc, Loc->getScope
()->getSubprogram()); return; } } while (0)
4330 &DII, BB, F, Var, Var->getScope()->getSubprogram(), Loc,do { if (!(VarSP == LocSP)) { CheckFailed("mismatched subprogram between llvm.dbg."
+ Kind + " variable and !dbg attachment", &DII, BB, F, Var
, Var->getScope()->getSubprogram(), Loc, Loc->getScope
()->getSubprogram()); return; } } while (0)
4331 Loc->getScope()->getSubprogram())do { if (!(VarSP == LocSP)) { CheckFailed("mismatched subprogram between llvm.dbg."
+ Kind + " variable and !dbg attachment", &DII, BB, F, Var
, Var->getScope()->getSubprogram(), Loc, Loc->getScope
()->getSubprogram()); return; } } while (0)
;
4332}
4333
4334static uint64_t getVariableSize(const DILocalVariable &V) {
4335 // Be careful of broken types (checked elsewhere).
4336 const Metadata *RawType = V.getRawType();
4337 while (RawType) {
4338 // Try to get the size directly.
4339 if (auto *T = dyn_cast<DIType>(RawType))
4340 if (uint64_t Size = T->getSizeInBits())
4341 return Size;
4342
4343 if (auto *DT = dyn_cast<DIDerivedType>(RawType)) {
4344 // Look at the base type.
4345 RawType = DT->getRawBaseType();
4346 continue;
4347 }
4348
4349 // Missing type or size.
4350 break;
4351 }
4352
4353 // Fail gracefully.
4354 return 0;
4355}
4356
4357void Verifier::verifyBitPieceExpression(const DbgInfoIntrinsic &I) {
4358 DILocalVariable *V;
4359 DIExpression *E;
4360 if (auto *DVI = dyn_cast<DbgValueInst>(&I)) {
4361 V = dyn_cast_or_null<DILocalVariable>(DVI->getRawVariable());
4362 E = dyn_cast_or_null<DIExpression>(DVI->getRawExpression());
4363 } else {
4364 auto *DDI = cast<DbgDeclareInst>(&I);
4365 V = dyn_cast_or_null<DILocalVariable>(DDI->getRawVariable());
4366 E = dyn_cast_or_null<DIExpression>(DDI->getRawExpression());
4367 }
4368
4369 // We don't know whether this intrinsic verified correctly.
4370 if (!V || !E || !E->isValid())
4371 return;
4372
4373 // Nothing to do if this isn't a bit piece expression.
4374 if (!E->isBitPiece())
4375 return;
4376
4377 // The frontend helps out GDB by emitting the members of local anonymous
4378 // unions as artificial local variables with shared storage. When SROA splits
4379 // the storage for artificial local variables that are smaller than the entire
4380 // union, the overhang piece will be outside of the allotted space for the
4381 // variable and this check fails.
4382 // FIXME: Remove this check as soon as clang stops doing this; it hides bugs.
4383 if (V->isArtificial())
4384 return;
4385
4386 // If there's no size, the type is broken, but that should be checked
4387 // elsewhere.
4388 uint64_t VarSize = getVariableSize(*V);
4389 if (!VarSize)
4390 return;
4391
4392 unsigned PieceSize = E->getBitPieceSize();
4393 unsigned PieceOffset = E->getBitPieceOffset();
4394 Assert(PieceSize + PieceOffset <= VarSize,do { if (!(PieceSize + PieceOffset <= VarSize)) { CheckFailed
("piece is larger than or outside of variable", &I, V, E)
; return; } } while (0)
4395 "piece is larger than or outside of variable", &I, V, E)do { if (!(PieceSize + PieceOffset <= VarSize)) { CheckFailed
("piece is larger than or outside of variable", &I, V, E)
; return; } } while (0)
;
4396 Assert(PieceSize != VarSize, "piece covers entire variable", &I, V, E)do { if (!(PieceSize != VarSize)) { CheckFailed("piece covers entire variable"
, &I, V, E); return; } } while (0)
;
4397}
4398
4399void Verifier::verifyCompileUnits() {
4400 auto *CUs = M->getNamedMetadata("llvm.dbg.cu");
4401 SmallPtrSet<const Metadata *, 2> Listed;
4402 if (CUs)
4403 Listed.insert(CUs->op_begin(), CUs->op_end());
4404 Assert(do { if (!(std::all_of(CUVisited.begin(), CUVisited.end(), [&
Listed](const Metadata *CU) { return Listed.count(CU); }))) {
CheckFailed("All DICompileUnits must be listed in llvm.dbg.cu"
); return; } } while (0)
4405 std::all_of(CUVisited.begin(), CUVisited.end(),do { if (!(std::all_of(CUVisited.begin(), CUVisited.end(), [&
Listed](const Metadata *CU) { return Listed.count(CU); }))) {
CheckFailed("All DICompileUnits must be listed in llvm.dbg.cu"
); return; } } while (0)
4406 [&Listed](const Metadata *CU) { return Listed.count(CU); }),do { if (!(std::all_of(CUVisited.begin(), CUVisited.end(), [&
Listed](const Metadata *CU) { return Listed.count(CU); }))) {
CheckFailed("All DICompileUnits must be listed in llvm.dbg.cu"
); return; } } while (0)
4407 "All DICompileUnits must be listed in llvm.dbg.cu")do { if (!(std::all_of(CUVisited.begin(), CUVisited.end(), [&
Listed](const Metadata *CU) { return Listed.count(CU); }))) {
CheckFailed("All DICompileUnits must be listed in llvm.dbg.cu"
); return; } } while (0)
;
4408 CUVisited.clear();
4409}
4410
4411void Verifier::verifyDeoptimizeCallingConvs() {
4412 if (DeoptimizeDeclarations.empty())
4413 return;
4414
4415 const Function *First = DeoptimizeDeclarations[0];
4416 for (auto *F : makeArrayRef(DeoptimizeDeclarations).slice(1)) {
4417 Assert(First->getCallingConv() == F->getCallingConv(),do { if (!(First->getCallingConv() == F->getCallingConv
())) { CheckFailed("All llvm.experimental.deoptimize declarations must have the same "
"calling convention", First, F); return; } } while (0)
4418 "All llvm.experimental.deoptimize declarations must have the same "do { if (!(First->getCallingConv() == F->getCallingConv
())) { CheckFailed("All llvm.experimental.deoptimize declarations must have the same "
"calling convention", First, F); return; } } while (0)
4419 "calling convention",do { if (!(First->getCallingConv() == F->getCallingConv
())) { CheckFailed("All llvm.experimental.deoptimize declarations must have the same "
"calling convention", First, F); return; } } while (0)
4420 First, F)do { if (!(First->getCallingConv() == F->getCallingConv
())) { CheckFailed("All llvm.experimental.deoptimize declarations must have the same "
"calling convention", First, F); return; } } while (0)
;
4421 }
4422}
4423
4424//===----------------------------------------------------------------------===//
4425// Implement the public interfaces to this file...
4426//===----------------------------------------------------------------------===//
4427
4428bool llvm::verifyFunction(const Function &f, raw_ostream *OS) {
4429 Function &F = const_cast<Function &>(f);
4430 assert(!F.isDeclaration() && "Cannot verify external functions")((!F.isDeclaration() && "Cannot verify external functions"
) ? static_cast<void> (0) : __assert_fail ("!F.isDeclaration() && \"Cannot verify external functions\""
, "/tmp/buildd/llvm-toolchain-snapshot-3.9~svn271203/lib/IR/Verifier.cpp"
, 4430, __PRETTY_FUNCTION__))
;
4431
4432 // Don't use a raw_null_ostream. Printing IR is expensive.
4433 Verifier V(OS, /*ShouldTreatBrokenDebugInfoAsError=*/true);
4434
4435 // Note that this function's return value is inverted from what you would
4436 // expect of a function called "verify".
4437 return !V.verify(F);
4438}
4439
4440bool llvm::verifyModule(const Module &M, raw_ostream *OS,
4441 bool *BrokenDebugInfo) {
4442 // Don't use a raw_null_ostream. Printing IR is expensive.
4443 Verifier V(OS, /*ShouldTreatBrokenDebugInfoAsError=*/!BrokenDebugInfo);
4444
4445 bool Broken = false;
4446 for (const Function &F : M)
4447 if (!F.isDeclaration() && !F.isMaterializable())
4448 Broken |= !V.verify(F);
4449
4450 Broken |= !V.verify(M);
4451 if (BrokenDebugInfo)
4452 *BrokenDebugInfo = V.hasBrokenDebugInfo();
4453 // Note that this function's return value is inverted from what you would
4454 // expect of a function called "verify".
4455 return Broken;
4456}
4457
4458namespace {
4459struct VerifierLegacyPass : public FunctionPass {
4460 static char ID;
4461
4462 Verifier V;
4463 bool FatalErrors = true;
4464
4465 VerifierLegacyPass()
4466 : FunctionPass(ID),
4467 V(&dbgs(), /*ShouldTreatBrokenDebugInfoAsError=*/false) {
4468 initializeVerifierLegacyPassPass(*PassRegistry::getPassRegistry());
4469 }
4470 explicit VerifierLegacyPass(bool FatalErrors)
4471 : FunctionPass(ID),
4472 V(&dbgs(), /*ShouldTreatBrokenDebugInfoAsError=*/false),
4473 FatalErrors(FatalErrors) {
4474 initializeVerifierLegacyPassPass(*PassRegistry::getPassRegistry());
4475 }
4476
4477 bool runOnFunction(Function &F) override {
4478 if (!V.verify(F) && FatalErrors)
4479 report_fatal_error("Broken function found, compilation aborted!");
4480
4481 return false;
4482 }
4483
4484 bool doFinalization(Module &M) override {
4485 bool HasErrors = !V.verify(M);
4486 if (FatalErrors) {
4487 if (HasErrors)
4488 report_fatal_error("Broken module found, compilation aborted!");
4489 assert(!V.hasBrokenDebugInfo() && "Module contains invalid debug info")((!V.hasBrokenDebugInfo() && "Module contains invalid debug info"
) ? static_cast<void> (0) : __assert_fail ("!V.hasBrokenDebugInfo() && \"Module contains invalid debug info\""
, "/tmp/buildd/llvm-toolchain-snapshot-3.9~svn271203/lib/IR/Verifier.cpp"
, 4489, __PRETTY_FUNCTION__))
;
4490 }
4491
4492 // Strip broken debug info.
4493 if (V.hasBrokenDebugInfo()) {
4494 DiagnosticInfoIgnoringInvalidDebugMetadata DiagInvalid(M);
4495 M.getContext().diagnose(DiagInvalid);
4496 if (!StripDebugInfo(M))
4497 report_fatal_error("Failed to strip malformed debug info");
4498 }
4499 return false;
4500 }
4501
4502 void getAnalysisUsage(AnalysisUsage &AU) const override {
4503 AU.setPreservesAll();
4504 }
4505};
4506}
4507
4508char VerifierLegacyPass::ID = 0;
4509INITIALIZE_PASS(VerifierLegacyPass, "verify", "Module Verifier", false, false)static void* initializeVerifierLegacyPassPassOnce(PassRegistry
&Registry) { PassInfo *PI = new PassInfo("Module Verifier"
, "verify", & VerifierLegacyPass ::ID, PassInfo::NormalCtor_t
(callDefaultCtor< VerifierLegacyPass >), false, false);
Registry.registerPass(*PI, true); return PI; } void llvm::initializeVerifierLegacyPassPass
(PassRegistry &Registry) { static volatile sys::cas_flag initialized
= 0; sys::cas_flag old_val = sys::CompareAndSwap(&initialized
, 1, 0); if (old_val == 0) { initializeVerifierLegacyPassPassOnce
(Registry); sys::MemoryFence(); ; ; initialized = 2; ; } else
{ sys::cas_flag tmp = initialized; sys::MemoryFence(); while
(tmp != 2) { tmp = initialized; sys::MemoryFence(); } } ; }
4510
4511FunctionPass *llvm::createVerifierPass(bool FatalErrors) {
4512 return new VerifierLegacyPass(FatalErrors);
4513}
4514
4515char VerifierAnalysis::PassID;
4516VerifierAnalysis::Result VerifierAnalysis::run(Module &M) {
4517 Result Res;
4518 Res.IRBroken = llvm::verifyModule(M, &dbgs(), &Res.DebugInfoBroken);
4519 return Res;
4520}
4521
4522VerifierAnalysis::Result VerifierAnalysis::run(Function &F) {
4523 return { llvm::verifyFunction(F, &dbgs()), false };
4524}
4525
4526PreservedAnalyses VerifierPass::run(Module &M, ModuleAnalysisManager &AM) {
4527 auto Res = AM.getResult<VerifierAnalysis>(M);
4528 if (FatalErrors) {
4529 if (Res.IRBroken)
4530 report_fatal_error("Broken module found, compilation aborted!");
4531 assert(!Res.DebugInfoBroken && "Module contains invalid debug info")((!Res.DebugInfoBroken && "Module contains invalid debug info"
) ? static_cast<void> (0) : __assert_fail ("!Res.DebugInfoBroken && \"Module contains invalid debug info\""
, "/tmp/buildd/llvm-toolchain-snapshot-3.9~svn271203/lib/IR/Verifier.cpp"
, 4531, __PRETTY_FUNCTION__))
;
4532 }
4533
4534 // Strip broken debug info.
4535 if (Res.DebugInfoBroken) {
4536 DiagnosticInfoIgnoringInvalidDebugMetadata DiagInvalid(M);
4537 M.getContext().diagnose(DiagInvalid);
4538 if (!StripDebugInfo(M))
4539 report_fatal_error("Failed to strip malformed debug info");
4540 }
4541 return PreservedAnalyses::all();
4542}
4543
4544PreservedAnalyses VerifierPass::run(Function &F, FunctionAnalysisManager &AM) {
4545 auto res = AM.getResult<VerifierAnalysis>(F);
4546 if (res.IRBroken && FatalErrors)
4547 report_fatal_error("Broken function found, compilation aborted!");
4548
4549 return PreservedAnalyses::all();
4550}