Bug Summary

File:build/source/llvm/lib/IR/Verifier.cpp
Warning:line 2822, column 5
Called C++ object pointer is null

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name Verifier.cpp -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -analyzer-config-compatibility-mode=true -mrelocation-model pic -pic-level 2 -mframe-pointer=none -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/build/source/build-llvm/tools/clang/stage2-bins -resource-dir /usr/lib/llvm-17/lib/clang/17 -D _DEBUG -D _GLIBCXX_ASSERTIONS -D _GNU_SOURCE -D _LIBCPP_ENABLE_ASSERTIONS -D __STDC_CONSTANT_MACROS -D __STDC_FORMAT_MACROS -D __STDC_LIMIT_MACROS -I lib/IR -I /build/source/llvm/lib/IR -I include -I /build/source/llvm/include -D _FORTIFY_SOURCE=2 -D NDEBUG -U NDEBUG -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/x86_64-linux-gnu/c++/10 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/backward -internal-isystem /usr/lib/llvm-17/lib/clang/17/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -fmacro-prefix-map=/build/source/build-llvm/tools/clang/stage2-bins=build-llvm/tools/clang/stage2-bins -fmacro-prefix-map=/build/source/= -fcoverage-prefix-map=/build/source/build-llvm/tools/clang/stage2-bins=build-llvm/tools/clang/stage2-bins -fcoverage-prefix-map=/build/source/= -source-date-epoch 1683717183 -O2 -Wno-unused-command-line-argument -Wno-unused-parameter -Wwrite-strings -Wno-missing-field-initializers -Wno-long-long -Wno-maybe-uninitialized -Wno-class-memaccess -Wno-redundant-move -Wno-pessimizing-move -Wno-noexcept-type -Wno-comment -Wno-misleading-indentation -std=c++17 -fdeprecated-macro -fdebug-compilation-dir=/build/source/build-llvm/tools/clang/stage2-bins -fdebug-prefix-map=/build/source/build-llvm/tools/clang/stage2-bins=build-llvm/tools/clang/stage2-bins -fdebug-prefix-map=/build/source/= -ferror-limit 19 -fvisibility-inlines-hidden -stack-protector 2 -fgnuc-version=4.2.1 -fcolor-diagnostics -vectorize-loops -vectorize-slp -analyzer-output=html -analyzer-config stable-report-filename=true -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /tmp/scan-build-2023-05-10-133810-16478-1 -x c++ /build/source/llvm/lib/IR/Verifier.cpp

/build/source/llvm/lib/IR/Verifier.cpp

1//===-- Verifier.cpp - Implement the Module Verifier -----------------------==//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the function verifier interface, that can be used for some
10// basic correctness checking of input to the system.
11//
12// Note that this does not provide full `Java style' security and verifications,
13// instead it just tries to ensure that code is well-formed.
14//
15// * Both of a binary operator's parameters are of the same type
16// * Verify that the indices of mem access instructions match other operands
17// * Verify that arithmetic and other things are only performed on first-class
18// types. Verify that shifts & logicals only happen on integrals f.e.
19// * All of the constants in a switch statement are of the correct type
20// * The code is in valid SSA form
21// * It should be illegal to put a label into any other type (like a structure)
22// or to return one. [except constant arrays!]
23// * Only phi nodes can be self referential: 'add i32 %0, %0 ; <int>:0' is bad
24// * PHI nodes must have an entry for each predecessor, with no extras.
25// * PHI nodes must be the first thing in a basic block, all grouped together
26// * All basic blocks should only end with terminator insts, not contain them
27// * The entry node to a function must not have predecessors
28// * All Instructions must be embedded into a basic block
29// * Functions cannot take a void-typed parameter
30// * Verify that a function's argument list agrees with it's declared type.
31// * It is illegal to specify a name for a void value.
32// * It is illegal to have a internal global value with no initializer
33// * It is illegal to have a ret instruction that returns a value that does not
34// agree with the function return value type.
35// * Function call argument types match the function prototype
36// * A landing pad is defined by a landingpad instruction, and can be jumped to
37// only by the unwind edge of an invoke instruction.
38// * A landingpad instruction must be the first non-PHI instruction in the
39// block.
40// * Landingpad instructions must be in a function with a personality function.
41// * All other things that are tested by asserts spread about the code...
42//
43//===----------------------------------------------------------------------===//
44
45#include "llvm/IR/Verifier.h"
46#include "llvm/ADT/APFloat.h"
47#include "llvm/ADT/APInt.h"
48#include "llvm/ADT/ArrayRef.h"
49#include "llvm/ADT/DenseMap.h"
50#include "llvm/ADT/MapVector.h"
51#include "llvm/ADT/STLExtras.h"
52#include "llvm/ADT/SmallPtrSet.h"
53#include "llvm/ADT/SmallSet.h"
54#include "llvm/ADT/SmallVector.h"
55#include "llvm/ADT/StringExtras.h"
56#include "llvm/ADT/StringMap.h"
57#include "llvm/ADT/StringRef.h"
58#include "llvm/ADT/Twine.h"
59#include "llvm/BinaryFormat/Dwarf.h"
60#include "llvm/IR/Argument.h"
61#include "llvm/IR/Attributes.h"
62#include "llvm/IR/BasicBlock.h"
63#include "llvm/IR/CFG.h"
64#include "llvm/IR/CallingConv.h"
65#include "llvm/IR/Comdat.h"
66#include "llvm/IR/Constant.h"
67#include "llvm/IR/ConstantRange.h"
68#include "llvm/IR/Constants.h"
69#include "llvm/IR/DataLayout.h"
70#include "llvm/IR/DebugInfo.h"
71#include "llvm/IR/DebugInfoMetadata.h"
72#include "llvm/IR/DebugLoc.h"
73#include "llvm/IR/DerivedTypes.h"
74#include "llvm/IR/Dominators.h"
75#include "llvm/IR/EHPersonalities.h"
76#include "llvm/IR/Function.h"
77#include "llvm/IR/GCStrategy.h"
78#include "llvm/IR/GlobalAlias.h"
79#include "llvm/IR/GlobalValue.h"
80#include "llvm/IR/GlobalVariable.h"
81#include "llvm/IR/InlineAsm.h"
82#include "llvm/IR/InstVisitor.h"
83#include "llvm/IR/InstrTypes.h"
84#include "llvm/IR/Instruction.h"
85#include "llvm/IR/Instructions.h"
86#include "llvm/IR/IntrinsicInst.h"
87#include "llvm/IR/Intrinsics.h"
88#include "llvm/IR/IntrinsicsAArch64.h"
89#include "llvm/IR/IntrinsicsARM.h"
90#include "llvm/IR/IntrinsicsWebAssembly.h"
91#include "llvm/IR/LLVMContext.h"
92#include "llvm/IR/Metadata.h"
93#include "llvm/IR/Module.h"
94#include "llvm/IR/ModuleSlotTracker.h"
95#include "llvm/IR/PassManager.h"
96#include "llvm/IR/Statepoint.h"
97#include "llvm/IR/Type.h"
98#include "llvm/IR/Use.h"
99#include "llvm/IR/User.h"
100#include "llvm/IR/Value.h"
101#include "llvm/InitializePasses.h"
102#include "llvm/Pass.h"
103#include "llvm/Support/AtomicOrdering.h"
104#include "llvm/Support/Casting.h"
105#include "llvm/Support/CommandLine.h"
106#include "llvm/Support/ErrorHandling.h"
107#include "llvm/Support/MathExtras.h"
108#include "llvm/Support/raw_ostream.h"
109#include <algorithm>
110#include <cassert>
111#include <cstdint>
112#include <memory>
113#include <optional>
114#include <string>
115#include <utility>
116
117using namespace llvm;
118
119static cl::opt<bool> VerifyNoAliasScopeDomination(
120 "verify-noalias-scope-decl-dom", cl::Hidden, cl::init(false),
121 cl::desc("Ensure that llvm.experimental.noalias.scope.decl for identical "
122 "scopes are not dominating"));
123
124namespace llvm {
125
126struct VerifierSupport {
127 raw_ostream *OS;
128 const Module &M;
129 ModuleSlotTracker MST;
130 Triple TT;
131 const DataLayout &DL;
132 LLVMContext &Context;
133
134 /// Track the brokenness of the module while recursively visiting.
135 bool Broken = false;
136 /// Broken debug info can be "recovered" from by stripping the debug info.
137 bool BrokenDebugInfo = false;
138 /// Whether to treat broken debug info as an error.
139 bool TreatBrokenDebugInfoAsError = true;
140
141 explicit VerifierSupport(raw_ostream *OS, const Module &M)
142 : OS(OS), M(M), MST(&M), TT(M.getTargetTriple()), DL(M.getDataLayout()),
143 Context(M.getContext()) {}
144
145private:
146 void Write(const Module *M) {
147 *OS << "; ModuleID = '" << M->getModuleIdentifier() << "'\n";
148 }
149
150 void Write(const Value *V) {
151 if (V)
152 Write(*V);
153 }
154
155 void Write(const Value &V) {
156 if (isa<Instruction>(V)) {
157 V.print(*OS, MST);
158 *OS << '\n';
159 } else {
160 V.printAsOperand(*OS, true, MST);
161 *OS << '\n';
162 }
163 }
164
165 void Write(const Metadata *MD) {
166 if (!MD)
167 return;
168 MD->print(*OS, MST, &M);
169 *OS << '\n';
170 }
171
172 template <class T> void Write(const MDTupleTypedArrayWrapper<T> &MD) {
173 Write(MD.get());
174 }
175
176 void Write(const NamedMDNode *NMD) {
177 if (!NMD)
178 return;
179 NMD->print(*OS, MST);
180 *OS << '\n';
181 }
182
183 void Write(Type *T) {
184 if (!T)
185 return;
186 *OS << ' ' << *T;
187 }
188
189 void Write(const Comdat *C) {
190 if (!C)
191 return;
192 *OS << *C;
193 }
194
195 void Write(const APInt *AI) {
196 if (!AI)
197 return;
198 *OS << *AI << '\n';
199 }
200
201 void Write(const unsigned i) { *OS << i << '\n'; }
202
203 // NOLINTNEXTLINE(readability-identifier-naming)
204 void Write(const Attribute *A) {
205 if (!A)
206 return;
207 *OS << A->getAsString() << '\n';
208 }
209
210 // NOLINTNEXTLINE(readability-identifier-naming)
211 void Write(const AttributeSet *AS) {
212 if (!AS)
213 return;
214 *OS << AS->getAsString() << '\n';
215 }
216
217 // NOLINTNEXTLINE(readability-identifier-naming)
218 void Write(const AttributeList *AL) {
219 if (!AL)
220 return;
221 AL->print(*OS);
222 }
223
224 template <typename T> void Write(ArrayRef<T> Vs) {
225 for (const T &V : Vs)
226 Write(V);
227 }
228
229 template <typename T1, typename... Ts>
230 void WriteTs(const T1 &V1, const Ts &... Vs) {
231 Write(V1);
232 WriteTs(Vs...);
233 }
234
235 template <typename... Ts> void WriteTs() {}
236
237public:
238 /// A check failed, so printout out the condition and the message.
239 ///
240 /// This provides a nice place to put a breakpoint if you want to see why
241 /// something is not correct.
242 void CheckFailed(const Twine &Message) {
243 if (OS)
244 *OS << Message << '\n';
245 Broken = true;
246 }
247
248 /// A check failed (with values to print).
249 ///
250 /// This calls the Message-only version so that the above is easier to set a
251 /// breakpoint on.
252 template <typename T1, typename... Ts>
253 void CheckFailed(const Twine &Message, const T1 &V1, const Ts &... Vs) {
254 CheckFailed(Message);
255 if (OS)
256 WriteTs(V1, Vs...);
257 }
258
259 /// A debug info check failed.
260 void DebugInfoCheckFailed(const Twine &Message) {
261 if (OS)
262 *OS << Message << '\n';
263 Broken |= TreatBrokenDebugInfoAsError;
264 BrokenDebugInfo = true;
265 }
266
267 /// A debug info check failed (with values to print).
268 template <typename T1, typename... Ts>
269 void DebugInfoCheckFailed(const Twine &Message, const T1 &V1,
270 const Ts &... Vs) {
271 DebugInfoCheckFailed(Message);
272 if (OS)
273 WriteTs(V1, Vs...);
274 }
275};
276
277} // namespace llvm
278
279namespace {
280
281class Verifier : public InstVisitor<Verifier>, VerifierSupport {
282 friend class InstVisitor<Verifier>;
283
284 // ISD::ArgFlagsTy::MemAlign only have 4 bits for alignment, so
285 // the alignment size should not exceed 2^15. Since encode(Align)
286 // would plus the shift value by 1, the alignment size should
287 // not exceed 2^14, otherwise it can NOT be properly lowered
288 // in backend.
289 static constexpr unsigned ParamMaxAlignment = 1 << 14;
290 DominatorTree DT;
291
292 /// When verifying a basic block, keep track of all of the
293 /// instructions we have seen so far.
294 ///
295 /// This allows us to do efficient dominance checks for the case when an
296 /// instruction has an operand that is an instruction in the same block.
297 SmallPtrSet<Instruction *, 16> InstsInThisBlock;
298
299 /// Keep track of the metadata nodes that have been checked already.
300 SmallPtrSet<const Metadata *, 32> MDNodes;
301
302 /// Keep track which DISubprogram is attached to which function.
303 DenseMap<const DISubprogram *, const Function *> DISubprogramAttachments;
304
305 /// Track all DICompileUnits visited.
306 SmallPtrSet<const Metadata *, 2> CUVisited;
307
308 /// The result type for a landingpad.
309 Type *LandingPadResultTy;
310
311 /// Whether we've seen a call to @llvm.localescape in this function
312 /// already.
313 bool SawFrameEscape;
314
315 /// Whether the current function has a DISubprogram attached to it.
316 bool HasDebugInfo = false;
317
318 /// The current source language.
319 dwarf::SourceLanguage CurrentSourceLang = dwarf::DW_LANG_lo_user;
320
321 /// Whether source was present on the first DIFile encountered in each CU.
322 DenseMap<const DICompileUnit *, bool> HasSourceDebugInfo;
323
324 /// Stores the count of how many objects were passed to llvm.localescape for a
325 /// given function and the largest index passed to llvm.localrecover.
326 DenseMap<Function *, std::pair<unsigned, unsigned>> FrameEscapeInfo;
327
328 // Maps catchswitches and cleanuppads that unwind to siblings to the
329 // terminators that indicate the unwind, used to detect cycles therein.
330 MapVector<Instruction *, Instruction *> SiblingFuncletInfo;
331
332 /// Cache which blocks are in which funclet, if an EH funclet personality is
333 /// in use. Otherwise empty.
334 DenseMap<BasicBlock *, ColorVector> BlockEHFuncletColors;
335
336 /// Cache of constants visited in search of ConstantExprs.
337 SmallPtrSet<const Constant *, 32> ConstantExprVisited;
338
339 /// Cache of declarations of the llvm.experimental.deoptimize.<ty> intrinsic.
340 SmallVector<const Function *, 4> DeoptimizeDeclarations;
341
342 /// Cache of attribute lists verified.
343 SmallPtrSet<const void *, 32> AttributeListsVisited;
344
345 // Verify that this GlobalValue is only used in this module.
346 // This map is used to avoid visiting uses twice. We can arrive at a user
347 // twice, if they have multiple operands. In particular for very large
348 // constant expressions, we can arrive at a particular user many times.
349 SmallPtrSet<const Value *, 32> GlobalValueVisited;
350
351 // Keeps track of duplicate function argument debug info.
352 SmallVector<const DILocalVariable *, 16> DebugFnArgs;
353
354 TBAAVerifier TBAAVerifyHelper;
355
356 SmallVector<IntrinsicInst *, 4> NoAliasScopeDecls;
357
358 void checkAtomicMemAccessSize(Type *Ty, const Instruction *I);
359
360public:
361 explicit Verifier(raw_ostream *OS, bool ShouldTreatBrokenDebugInfoAsError,
362 const Module &M)
363 : VerifierSupport(OS, M), LandingPadResultTy(nullptr),
364 SawFrameEscape(false), TBAAVerifyHelper(this) {
365 TreatBrokenDebugInfoAsError = ShouldTreatBrokenDebugInfoAsError;
366 }
367
368 bool hasBrokenDebugInfo() const { return BrokenDebugInfo; }
369
370 bool verify(const Function &F) {
371 assert(F.getParent() == &M &&(static_cast <bool> (F.getParent() == &M &&
"An instance of this class only works with a specific module!"
) ? void (0) : __assert_fail ("F.getParent() == &M && \"An instance of this class only works with a specific module!\""
, "llvm/lib/IR/Verifier.cpp", 372, __extension__ __PRETTY_FUNCTION__
))
372 "An instance of this class only works with a specific module!")(static_cast <bool> (F.getParent() == &M &&
"An instance of this class only works with a specific module!"
) ? void (0) : __assert_fail ("F.getParent() == &M && \"An instance of this class only works with a specific module!\""
, "llvm/lib/IR/Verifier.cpp", 372, __extension__ __PRETTY_FUNCTION__
))
;
373
374 // First ensure the function is well-enough formed to compute dominance
375 // information, and directly compute a dominance tree. We don't rely on the
376 // pass manager to provide this as it isolates us from a potentially
377 // out-of-date dominator tree and makes it significantly more complex to run
378 // this code outside of a pass manager.
379 // FIXME: It's really gross that we have to cast away constness here.
380 if (!F.empty())
381 DT.recalculate(const_cast<Function &>(F));
382
383 for (const BasicBlock &BB : F) {
384 if (!BB.empty() && BB.back().isTerminator())
385 continue;
386
387 if (OS) {
388 *OS << "Basic Block in function '" << F.getName()
389 << "' does not have terminator!\n";
390 BB.printAsOperand(*OS, true, MST);
391 *OS << "\n";
392 }
393 return false;
394 }
395
396 Broken = false;
397 // FIXME: We strip const here because the inst visitor strips const.
398 visit(const_cast<Function &>(F));
399 verifySiblingFuncletUnwinds();
400 InstsInThisBlock.clear();
401 DebugFnArgs.clear();
402 LandingPadResultTy = nullptr;
403 SawFrameEscape = false;
404 SiblingFuncletInfo.clear();
405 verifyNoAliasScopeDecl();
406 NoAliasScopeDecls.clear();
407
408 return !Broken;
409 }
410
411 /// Verify the module that this instance of \c Verifier was initialized with.
412 bool verify() {
413 Broken = false;
414
415 // Collect all declarations of the llvm.experimental.deoptimize intrinsic.
416 for (const Function &F : M)
417 if (F.getIntrinsicID() == Intrinsic::experimental_deoptimize)
418 DeoptimizeDeclarations.push_back(&F);
419
420 // Now that we've visited every function, verify that we never asked to
421 // recover a frame index that wasn't escaped.
422 verifyFrameRecoverIndices();
423 for (const GlobalVariable &GV : M.globals())
424 visitGlobalVariable(GV);
425
426 for (const GlobalAlias &GA : M.aliases())
427 visitGlobalAlias(GA);
428
429 for (const GlobalIFunc &GI : M.ifuncs())
430 visitGlobalIFunc(GI);
431
432 for (const NamedMDNode &NMD : M.named_metadata())
433 visitNamedMDNode(NMD);
434
435 for (const StringMapEntry<Comdat> &SMEC : M.getComdatSymbolTable())
436 visitComdat(SMEC.getValue());
437
438 visitModuleFlags();
439 visitModuleIdents();
440 visitModuleCommandLines();
441
442 verifyCompileUnits();
443
444 verifyDeoptimizeCallingConvs();
445 DISubprogramAttachments.clear();
446 return !Broken;
447 }
448
449private:
450 /// Whether a metadata node is allowed to be, or contain, a DILocation.
451 enum class AreDebugLocsAllowed { No, Yes };
452
453 // Verification methods...
454 void visitGlobalValue(const GlobalValue &GV);
455 void visitGlobalVariable(const GlobalVariable &GV);
456 void visitGlobalAlias(const GlobalAlias &GA);
457 void visitGlobalIFunc(const GlobalIFunc &GI);
458 void visitAliaseeSubExpr(const GlobalAlias &A, const Constant &C);
459 void visitAliaseeSubExpr(SmallPtrSetImpl<const GlobalAlias *> &Visited,
460 const GlobalAlias &A, const Constant &C);
461 void visitNamedMDNode(const NamedMDNode &NMD);
462 void visitMDNode(const MDNode &MD, AreDebugLocsAllowed AllowLocs);
463 void visitMetadataAsValue(const MetadataAsValue &MD, Function *F);
464 void visitValueAsMetadata(const ValueAsMetadata &MD, Function *F);
465 void visitComdat(const Comdat &C);
466 void visitModuleIdents();
467 void visitModuleCommandLines();
468 void visitModuleFlags();
469 void visitModuleFlag(const MDNode *Op,
470 DenseMap<const MDString *, const MDNode *> &SeenIDs,
471 SmallVectorImpl<const MDNode *> &Requirements);
472 void visitModuleFlagCGProfileEntry(const MDOperand &MDO);
473 void visitFunction(const Function &F);
474 void visitBasicBlock(BasicBlock &BB);
475 void visitRangeMetadata(Instruction &I, MDNode *Range, Type *Ty);
476 void visitDereferenceableMetadata(Instruction &I, MDNode *MD);
477 void visitProfMetadata(Instruction &I, MDNode *MD);
478 void visitCallStackMetadata(MDNode *MD);
479 void visitMemProfMetadata(Instruction &I, MDNode *MD);
480 void visitCallsiteMetadata(Instruction &I, MDNode *MD);
481 void visitDIAssignIDMetadata(Instruction &I, MDNode *MD);
482 void visitAnnotationMetadata(MDNode *Annotation);
483 void visitAliasScopeMetadata(const MDNode *MD);
484 void visitAliasScopeListMetadata(const MDNode *MD);
485 void visitAccessGroupMetadata(const MDNode *MD);
486
487 template <class Ty> bool isValidMetadataArray(const MDTuple &N);
488#define HANDLE_SPECIALIZED_MDNODE_LEAF(CLASS) void visit##CLASS(const CLASS &N);
489#include "llvm/IR/Metadata.def"
490 void visitDIScope(const DIScope &N);
491 void visitDIVariable(const DIVariable &N);
492 void visitDILexicalBlockBase(const DILexicalBlockBase &N);
493 void visitDITemplateParameter(const DITemplateParameter &N);
494
495 void visitTemplateParams(const MDNode &N, const Metadata &RawParams);
496
497 // InstVisitor overrides...
498 using InstVisitor<Verifier>::visit;
499 void visit(Instruction &I);
500
501 void visitTruncInst(TruncInst &I);
502 void visitZExtInst(ZExtInst &I);
503 void visitSExtInst(SExtInst &I);
504 void visitFPTruncInst(FPTruncInst &I);
505 void visitFPExtInst(FPExtInst &I);
506 void visitFPToUIInst(FPToUIInst &I);
507 void visitFPToSIInst(FPToSIInst &I);
508 void visitUIToFPInst(UIToFPInst &I);
509 void visitSIToFPInst(SIToFPInst &I);
510 void visitIntToPtrInst(IntToPtrInst &I);
511 void visitPtrToIntInst(PtrToIntInst &I);
512 void visitBitCastInst(BitCastInst &I);
513 void visitAddrSpaceCastInst(AddrSpaceCastInst &I);
514 void visitPHINode(PHINode &PN);
515 void visitCallBase(CallBase &Call);
516 void visitUnaryOperator(UnaryOperator &U);
517 void visitBinaryOperator(BinaryOperator &B);
518 void visitICmpInst(ICmpInst &IC);
519 void visitFCmpInst(FCmpInst &FC);
520 void visitExtractElementInst(ExtractElementInst &EI);
521 void visitInsertElementInst(InsertElementInst &EI);
522 void visitShuffleVectorInst(ShuffleVectorInst &EI);
523 void visitVAArgInst(VAArgInst &VAA) { visitInstruction(VAA); }
524 void visitCallInst(CallInst &CI);
525 void visitInvokeInst(InvokeInst &II);
526 void visitGetElementPtrInst(GetElementPtrInst &GEP);
527 void visitLoadInst(LoadInst &LI);
528 void visitStoreInst(StoreInst &SI);
529 void verifyDominatesUse(Instruction &I, unsigned i);
530 void visitInstruction(Instruction &I);
531 void visitTerminator(Instruction &I);
532 void visitBranchInst(BranchInst &BI);
533 void visitReturnInst(ReturnInst &RI);
534 void visitSwitchInst(SwitchInst &SI);
535 void visitIndirectBrInst(IndirectBrInst &BI);
536 void visitCallBrInst(CallBrInst &CBI);
537 void visitSelectInst(SelectInst &SI);
538 void visitUserOp1(Instruction &I);
539 void visitUserOp2(Instruction &I) { visitUserOp1(I); }
540 void visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call);
541 void visitConstrainedFPIntrinsic(ConstrainedFPIntrinsic &FPI);
542 void visitVPIntrinsic(VPIntrinsic &VPI);
543 void visitDbgIntrinsic(StringRef Kind, DbgVariableIntrinsic &DII);
544 void visitDbgLabelIntrinsic(StringRef Kind, DbgLabelInst &DLI);
545 void visitAtomicCmpXchgInst(AtomicCmpXchgInst &CXI);
546 void visitAtomicRMWInst(AtomicRMWInst &RMWI);
547 void visitFenceInst(FenceInst &FI);
548 void visitAllocaInst(AllocaInst &AI);
549 void visitExtractValueInst(ExtractValueInst &EVI);
550 void visitInsertValueInst(InsertValueInst &IVI);
551 void visitEHPadPredecessors(Instruction &I);
552 void visitLandingPadInst(LandingPadInst &LPI);
553 void visitResumeInst(ResumeInst &RI);
554 void visitCatchPadInst(CatchPadInst &CPI);
555 void visitCatchReturnInst(CatchReturnInst &CatchReturn);
556 void visitCleanupPadInst(CleanupPadInst &CPI);
557 void visitFuncletPadInst(FuncletPadInst &FPI);
558 void visitCatchSwitchInst(CatchSwitchInst &CatchSwitch);
559 void visitCleanupReturnInst(CleanupReturnInst &CRI);
560
561 void verifySwiftErrorCall(CallBase &Call, const Value *SwiftErrorVal);
562 void verifySwiftErrorValue(const Value *SwiftErrorVal);
563 void verifyTailCCMustTailAttrs(const AttrBuilder &Attrs, StringRef Context);
564 void verifyMustTailCall(CallInst &CI);
565 bool verifyAttributeCount(AttributeList Attrs, unsigned Params);
566 void verifyAttributeTypes(AttributeSet Attrs, const Value *V);
567 void verifyParameterAttrs(AttributeSet Attrs, Type *Ty, const Value *V);
568 void checkUnsignedBaseTenFuncAttr(AttributeList Attrs, StringRef Attr,
569 const Value *V);
570 void verifyFunctionAttrs(FunctionType *FT, AttributeList Attrs,
571 const Value *V, bool IsIntrinsic, bool IsInlineAsm);
572 void verifyFunctionMetadata(ArrayRef<std::pair<unsigned, MDNode *>> MDs);
573
574 void visitConstantExprsRecursively(const Constant *EntryC);
575 void visitConstantExpr(const ConstantExpr *CE);
576 void verifyInlineAsmCall(const CallBase &Call);
577 void verifyStatepoint(const CallBase &Call);
578 void verifyFrameRecoverIndices();
579 void verifySiblingFuncletUnwinds();
580
581 void verifyFragmentExpression(const DbgVariableIntrinsic &I);
582 template <typename ValueOrMetadata>
583 void verifyFragmentExpression(const DIVariable &V,
584 DIExpression::FragmentInfo Fragment,
585 ValueOrMetadata *Desc);
586 void verifyFnArgs(const DbgVariableIntrinsic &I);
587 void verifyNotEntryValue(const DbgVariableIntrinsic &I);
588
589 /// Module-level debug info verification...
590 void verifyCompileUnits();
591
592 /// Module-level verification that all @llvm.experimental.deoptimize
593 /// declarations share the same calling convention.
594 void verifyDeoptimizeCallingConvs();
595
596 void verifyAttachedCallBundle(const CallBase &Call,
597 const OperandBundleUse &BU);
598
599 /// Verify all-or-nothing property of DIFile source attribute within a CU.
600 void verifySourceDebugInfo(const DICompileUnit &U, const DIFile &F);
601
602 /// Verify the llvm.experimental.noalias.scope.decl declarations
603 void verifyNoAliasScopeDecl();
604};
605
606} // end anonymous namespace
607
608/// We know that cond should be true, if not print an error message.
609#define Check(C, ...)do { if (!(C)) { CheckFailed(...); return; } } while (false) \
610 do { \
611 if (!(C)) { \
612 CheckFailed(__VA_ARGS__); \
613 return; \
614 } \
615 } while (false)
616
617/// We know that a debug info condition should be true, if not print
618/// an error message.
619#define CheckDI(C, ...)do { if (!(C)) { DebugInfoCheckFailed(...); return; } } while
(false)
\
620 do { \
621 if (!(C)) { \
622 DebugInfoCheckFailed(__VA_ARGS__); \
623 return; \
624 } \
625 } while (false)
626
627void Verifier::visit(Instruction &I) {
628 for (unsigned i = 0, e = I.getNumOperands(); i != e; ++i)
629 Check(I.getOperand(i) != nullptr, "Operand is null", &I)do { if (!(I.getOperand(i) != nullptr)) { CheckFailed("Operand is null"
, &I); return; } } while (false)
;
630 InstVisitor<Verifier>::visit(I);
631}
632
633// Helper to iterate over indirect users. By returning false, the callback can ask to stop traversing further.
634static void forEachUser(const Value *User,
635 SmallPtrSet<const Value *, 32> &Visited,
636 llvm::function_ref<bool(const Value *)> Callback) {
637 if (!Visited.insert(User).second)
638 return;
639
640 SmallVector<const Value *> WorkList;
641 append_range(WorkList, User->materialized_users());
642 while (!WorkList.empty()) {
643 const Value *Cur = WorkList.pop_back_val();
644 if (!Visited.insert(Cur).second)
645 continue;
646 if (Callback(Cur))
647 append_range(WorkList, Cur->materialized_users());
648 }
649}
650
651void Verifier::visitGlobalValue(const GlobalValue &GV) {
652 Check(!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 (false)
653 "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 (false)
;
654
655 if (const GlobalObject *GO = dyn_cast<GlobalObject>(&GV)) {
656
657 if (MaybeAlign A = GO->getAlign()) {
658 Check(A->value() <= Value::MaximumAlignment,do { if (!(A->value() <= Value::MaximumAlignment)) { CheckFailed
("huge alignment values are unsupported", GO); return; } } while
(false)
659 "huge alignment values are unsupported", GO)do { if (!(A->value() <= Value::MaximumAlignment)) { CheckFailed
("huge alignment values are unsupported", GO); return; } } while
(false)
;
660 }
661
662 if (const MDNode *Associated =
663 GO->getMetadata(LLVMContext::MD_associated)) {
664 Check(Associated->getNumOperands() == 1,do { if (!(Associated->getNumOperands() == 1)) { CheckFailed
("associated metadata must have one operand", &GV, Associated
); return; } } while (false)
665 "associated metadata must have one operand", &GV, Associated)do { if (!(Associated->getNumOperands() == 1)) { CheckFailed
("associated metadata must have one operand", &GV, Associated
); return; } } while (false)
;
666 const Metadata *Op = Associated->getOperand(0).get();
667 Check(Op, "associated metadata must have a global value", GO, Associated)do { if (!(Op)) { CheckFailed("associated metadata must have a global value"
, GO, Associated); return; } } while (false)
;
668
669 const auto *VM = dyn_cast_or_null<ValueAsMetadata>(Op);
670 Check(VM, "associated metadata must be ValueAsMetadata", GO, Associated)do { if (!(VM)) { CheckFailed("associated metadata must be ValueAsMetadata"
, GO, Associated); return; } } while (false)
;
671 if (VM) {
672 Check(isa<PointerType>(VM->getValue()->getType()),do { if (!(isa<PointerType>(VM->getValue()->getType
()))) { CheckFailed("associated value must be pointer typed",
GV, Associated); return; } } while (false)
673 "associated value must be pointer typed", GV, Associated)do { if (!(isa<PointerType>(VM->getValue()->getType
()))) { CheckFailed("associated value must be pointer typed",
GV, Associated); return; } } while (false)
;
674
675 const Value *Stripped = VM->getValue()->stripPointerCastsAndAliases();
676 Check(isa<GlobalObject>(Stripped) || isa<Constant>(Stripped),do { if (!(isa<GlobalObject>(Stripped) || isa<Constant
>(Stripped))) { CheckFailed("associated metadata must point to a GlobalObject"
, GO, Stripped); return; } } while (false)
677 "associated metadata must point to a GlobalObject", GO, Stripped)do { if (!(isa<GlobalObject>(Stripped) || isa<Constant
>(Stripped))) { CheckFailed("associated metadata must point to a GlobalObject"
, GO, Stripped); return; } } while (false)
;
678 Check(Stripped != GO,do { if (!(Stripped != GO)) { CheckFailed("global values should not associate to themselves"
, GO, Associated); return; } } while (false)
679 "global values should not associate to themselves", GO,do { if (!(Stripped != GO)) { CheckFailed("global values should not associate to themselves"
, GO, Associated); return; } } while (false)
680 Associated)do { if (!(Stripped != GO)) { CheckFailed("global values should not associate to themselves"
, GO, Associated); return; } } while (false)
;
681 }
682 }
683 }
684 Check(!GV.hasAppendingLinkage() || isa<GlobalVariable>(GV),do { if (!(!GV.hasAppendingLinkage() || isa<GlobalVariable
>(GV))) { CheckFailed("Only global variables can have appending linkage!"
, &GV); return; } } while (false)
685 "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 (false)
;
686
687 if (GV.hasAppendingLinkage()) {
688 const GlobalVariable *GVar = dyn_cast<GlobalVariable>(&GV);
689 Check(GVar && GVar->getValueType()->isArrayTy(),do { if (!(GVar && GVar->getValueType()->isArrayTy
())) { CheckFailed("Only global arrays can have appending linkage!"
, GVar); return; } } while (false)
690 "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 (false)
;
691 }
692
693 if (GV.isDeclarationForLinker())
694 Check(!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 (false)
;
695
696 if (GV.hasDLLExportStorageClass()) {
697 Check(!GV.hasHiddenVisibility(),do { if (!(!GV.hasHiddenVisibility())) { CheckFailed("dllexport GlobalValue must have default or protected visibility"
, &GV); return; } } while (false)
698 "dllexport GlobalValue must have default or protected visibility",do { if (!(!GV.hasHiddenVisibility())) { CheckFailed("dllexport GlobalValue must have default or protected visibility"
, &GV); return; } } while (false)
699 &GV)do { if (!(!GV.hasHiddenVisibility())) { CheckFailed("dllexport GlobalValue must have default or protected visibility"
, &GV); return; } } while (false)
;
700 }
701 if (GV.hasDLLImportStorageClass()) {
702 Check(GV.hasDefaultVisibility(),do { if (!(GV.hasDefaultVisibility())) { CheckFailed("dllimport GlobalValue must have default visibility"
, &GV); return; } } while (false)
703 "dllimport GlobalValue must have default visibility", &GV)do { if (!(GV.hasDefaultVisibility())) { CheckFailed("dllimport GlobalValue must have default visibility"
, &GV); return; } } while (false)
;
704 Check(!GV.isDSOLocal(), "GlobalValue with DLLImport Storage is dso_local!",do { if (!(!GV.isDSOLocal())) { CheckFailed("GlobalValue with DLLImport Storage is dso_local!"
, &GV); return; } } while (false)
705 &GV)do { if (!(!GV.isDSOLocal())) { CheckFailed("GlobalValue with DLLImport Storage is dso_local!"
, &GV); return; } } while (false)
;
706
707 Check((GV.isDeclaration() &&do { if (!((GV.isDeclaration() && (GV.hasExternalLinkage
() || GV.hasExternalWeakLinkage())) || GV.hasAvailableExternallyLinkage
())) { CheckFailed("Global is marked as dllimport, but not external"
, &GV); return; } } while (false)
708 (GV.hasExternalLinkage() || GV.hasExternalWeakLinkage())) ||do { if (!((GV.isDeclaration() && (GV.hasExternalLinkage
() || GV.hasExternalWeakLinkage())) || GV.hasAvailableExternallyLinkage
())) { CheckFailed("Global is marked as dllimport, but not external"
, &GV); return; } } while (false)
709 GV.hasAvailableExternallyLinkage(),do { if (!((GV.isDeclaration() && (GV.hasExternalLinkage
() || GV.hasExternalWeakLinkage())) || GV.hasAvailableExternallyLinkage
())) { CheckFailed("Global is marked as dllimport, but not external"
, &GV); return; } } while (false)
710 "Global is marked as dllimport, but not external", &GV)do { if (!((GV.isDeclaration() && (GV.hasExternalLinkage
() || GV.hasExternalWeakLinkage())) || GV.hasAvailableExternallyLinkage
())) { CheckFailed("Global is marked as dllimport, but not external"
, &GV); return; } } while (false)
;
711 }
712
713 if (GV.isImplicitDSOLocal())
714 Check(GV.isDSOLocal(),do { if (!(GV.isDSOLocal())) { CheckFailed("GlobalValue with local linkage or non-default "
"visibility must be dso_local!", &GV); return; } } while
(false)
715 "GlobalValue with local linkage or non-default "do { if (!(GV.isDSOLocal())) { CheckFailed("GlobalValue with local linkage or non-default "
"visibility must be dso_local!", &GV); return; } } while
(false)
716 "visibility must be dso_local!",do { if (!(GV.isDSOLocal())) { CheckFailed("GlobalValue with local linkage or non-default "
"visibility must be dso_local!", &GV); return; } } while
(false)
717 &GV)do { if (!(GV.isDSOLocal())) { CheckFailed("GlobalValue with local linkage or non-default "
"visibility must be dso_local!", &GV); return; } } while
(false)
;
718
719 forEachUser(&GV, GlobalValueVisited, [&](const Value *V) -> bool {
720 if (const Instruction *I = dyn_cast<Instruction>(V)) {
721 if (!I->getParent() || !I->getParent()->getParent())
722 CheckFailed("Global is referenced by parentless instruction!", &GV, &M,
723 I);
724 else if (I->getParent()->getParent()->getParent() != &M)
725 CheckFailed("Global is referenced in a different module!", &GV, &M, I,
726 I->getParent()->getParent(),
727 I->getParent()->getParent()->getParent());
728 return false;
729 } else if (const Function *F = dyn_cast<Function>(V)) {
730 if (F->getParent() != &M)
731 CheckFailed("Global is used by function in a different module", &GV, &M,
732 F, F->getParent());
733 return false;
734 }
735 return true;
736 });
737}
738
739void Verifier::visitGlobalVariable(const GlobalVariable &GV) {
740 if (GV.hasInitializer()) {
741 Check(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 (false)
742 "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 (false)
743 "variable type!",do { if (!(GV.getInitializer()->getType() == GV.getValueType
())) { CheckFailed("Global variable initializer type does not match global "
"variable type!", &GV); return; } } while (false)
744 &GV)do { if (!(GV.getInitializer()->getType() == GV.getValueType
())) { CheckFailed("Global variable initializer type does not match global "
"variable type!", &GV); return; } } while (false)
;
745 // If the global has common linkage, it must have a zero initializer and
746 // cannot be constant.
747 if (GV.hasCommonLinkage()) {
748 Check(GV.getInitializer()->isNullValue(),do { if (!(GV.getInitializer()->isNullValue())) { CheckFailed
("'common' global must have a zero initializer!", &GV); return
; } } while (false)
749 "'common' global must have a zero initializer!", &GV)do { if (!(GV.getInitializer()->isNullValue())) { CheckFailed
("'common' global must have a zero initializer!", &GV); return
; } } while (false)
;
750 Check(!GV.isConstant(), "'common' global may not be marked constant!",do { if (!(!GV.isConstant())) { CheckFailed("'common' global may not be marked constant!"
, &GV); return; } } while (false)
751 &GV)do { if (!(!GV.isConstant())) { CheckFailed("'common' global may not be marked constant!"
, &GV); return; } } while (false)
;
752 Check(!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 (false)
;
753 }
754 }
755
756 if (GV.hasName() && (GV.getName() == "llvm.global_ctors" ||
757 GV.getName() == "llvm.global_dtors")) {
758 Check(!GV.hasInitializer() || GV.hasAppendingLinkage(),do { if (!(!GV.hasInitializer() || GV.hasAppendingLinkage()))
{ CheckFailed("invalid linkage for intrinsic global variable"
, &GV); return; } } while (false)
759 "invalid linkage for intrinsic global variable", &GV)do { if (!(!GV.hasInitializer() || GV.hasAppendingLinkage()))
{ CheckFailed("invalid linkage for intrinsic global variable"
, &GV); return; } } while (false)
;
760 Check(GV.materialized_use_empty(),do { if (!(GV.materialized_use_empty())) { CheckFailed("invalid uses of intrinsic global variable"
, &GV); return; } } while (false)
761 "invalid uses of intrinsic global variable", &GV)do { if (!(GV.materialized_use_empty())) { CheckFailed("invalid uses of intrinsic global variable"
, &GV); return; } } while (false)
;
762
763 // Don't worry about emitting an error for it not being an array,
764 // visitGlobalValue will complain on appending non-array.
765 if (ArrayType *ATy = dyn_cast<ArrayType>(GV.getValueType())) {
766 StructType *STy = dyn_cast<StructType>(ATy->getElementType());
767 PointerType *FuncPtrTy =
768 FunctionType::get(Type::getVoidTy(Context), false)->
769 getPointerTo(DL.getProgramAddressSpace());
770 Check(STy && (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 (false)
771 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 (false)
772 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 (false)
773 "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 (false)
;
774 Check(STy->getNumElements() == 3,do { if (!(STy->getNumElements() == 3)) { CheckFailed("the third field of the element type is mandatory, "
"specify ptr null to migrate from the obsoleted 2-field form"
); return; } } while (false)
775 "the third field of the element type is mandatory, "do { if (!(STy->getNumElements() == 3)) { CheckFailed("the third field of the element type is mandatory, "
"specify ptr null to migrate from the obsoleted 2-field form"
); return; } } while (false)
776 "specify ptr null to migrate from the obsoleted 2-field form")do { if (!(STy->getNumElements() == 3)) { CheckFailed("the third field of the element type is mandatory, "
"specify ptr null to migrate from the obsoleted 2-field form"
); return; } } while (false)
;
777 Type *ETy = STy->getTypeAtIndex(2);
778 Type *Int8Ty = Type::getInt8Ty(ETy->getContext());
779 Check(ETy->isPointerTy() &&do { if (!(ETy->isPointerTy() && cast<PointerType
>(ETy)->isOpaqueOrPointeeTypeMatches(Int8Ty))) { CheckFailed
("wrong type for intrinsic global variable", &GV); return
; } } while (false)
780 cast<PointerType>(ETy)->isOpaqueOrPointeeTypeMatches(Int8Ty),do { if (!(ETy->isPointerTy() && cast<PointerType
>(ETy)->isOpaqueOrPointeeTypeMatches(Int8Ty))) { CheckFailed
("wrong type for intrinsic global variable", &GV); return
; } } while (false)
781 "wrong type for intrinsic global variable", &GV)do { if (!(ETy->isPointerTy() && cast<PointerType
>(ETy)->isOpaqueOrPointeeTypeMatches(Int8Ty))) { CheckFailed
("wrong type for intrinsic global variable", &GV); return
; } } while (false)
;
782 }
783 }
784
785 if (GV.hasName() && (GV.getName() == "llvm.used" ||
786 GV.getName() == "llvm.compiler.used")) {
787 Check(!GV.hasInitializer() || GV.hasAppendingLinkage(),do { if (!(!GV.hasInitializer() || GV.hasAppendingLinkage()))
{ CheckFailed("invalid linkage for intrinsic global variable"
, &GV); return; } } while (false)
788 "invalid linkage for intrinsic global variable", &GV)do { if (!(!GV.hasInitializer() || GV.hasAppendingLinkage()))
{ CheckFailed("invalid linkage for intrinsic global variable"
, &GV); return; } } while (false)
;
789 Check(GV.materialized_use_empty(),do { if (!(GV.materialized_use_empty())) { CheckFailed("invalid uses of intrinsic global variable"
, &GV); return; } } while (false)
790 "invalid uses of intrinsic global variable", &GV)do { if (!(GV.materialized_use_empty())) { CheckFailed("invalid uses of intrinsic global variable"
, &GV); return; } } while (false)
;
791
792 Type *GVType = GV.getValueType();
793 if (ArrayType *ATy = dyn_cast<ArrayType>(GVType)) {
794 PointerType *PTy = dyn_cast<PointerType>(ATy->getElementType());
795 Check(PTy, "wrong type for intrinsic global variable", &GV)do { if (!(PTy)) { CheckFailed("wrong type for intrinsic global variable"
, &GV); return; } } while (false)
;
796 if (GV.hasInitializer()) {
797 const Constant *Init = GV.getInitializer();
798 const ConstantArray *InitArray = dyn_cast<ConstantArray>(Init);
799 Check(InitArray, "wrong initalizer for intrinsic global variable",do { if (!(InitArray)) { CheckFailed("wrong initalizer for intrinsic global variable"
, Init); return; } } while (false)
800 Init)do { if (!(InitArray)) { CheckFailed("wrong initalizer for intrinsic global variable"
, Init); return; } } while (false)
;
801 for (Value *Op : InitArray->operands()) {
802 Value *V = Op->stripPointerCasts();
803 Check(isa<GlobalVariable>(V) || isa<Function>(V) ||do { if (!(isa<GlobalVariable>(V) || isa<Function>
(V) || isa<GlobalAlias>(V))) { CheckFailed(Twine("invalid "
) + GV.getName() + " member", V); return; } } while (false)
804 isa<GlobalAlias>(V),do { if (!(isa<GlobalVariable>(V) || isa<Function>
(V) || isa<GlobalAlias>(V))) { CheckFailed(Twine("invalid "
) + GV.getName() + " member", V); return; } } while (false)
805 Twine("invalid ") + GV.getName() + " member", V)do { if (!(isa<GlobalVariable>(V) || isa<Function>
(V) || isa<GlobalAlias>(V))) { CheckFailed(Twine("invalid "
) + GV.getName() + " member", V); return; } } while (false)
;
806 Check(V->hasName(),do { if (!(V->hasName())) { CheckFailed(Twine("members of "
) + GV.getName() + " must be named", V); return; } } while (false
)
807 Twine("members of ") + GV.getName() + " must be named", V)do { if (!(V->hasName())) { CheckFailed(Twine("members of "
) + GV.getName() + " must be named", V); return; } } while (false
)
;
808 }
809 }
810 }
811 }
812
813 // Visit any debug info attachments.
814 SmallVector<MDNode *, 1> MDs;
815 GV.getMetadata(LLVMContext::MD_dbg, MDs);
816 for (auto *MD : MDs) {
817 if (auto *GVE = dyn_cast<DIGlobalVariableExpression>(MD))
818 visitDIGlobalVariableExpression(*GVE);
819 else
820 CheckDI(false, "!dbg attachment of global variable must be a "do { if (!(false)) { DebugInfoCheckFailed("!dbg attachment of global variable must be a "
"DIGlobalVariableExpression"); return; } } while (false)
821 "DIGlobalVariableExpression")do { if (!(false)) { DebugInfoCheckFailed("!dbg attachment of global variable must be a "
"DIGlobalVariableExpression"); return; } } while (false)
;
822 }
823
824 // Scalable vectors cannot be global variables, since we don't know
825 // the runtime size. If the global is an array containing scalable vectors,
826 // that will be caught by the isValidElementType methods in StructType or
827 // ArrayType instead.
828 Check(!isa<ScalableVectorType>(GV.getValueType()),do { if (!(!isa<ScalableVectorType>(GV.getValueType()))
) { CheckFailed("Globals cannot contain scalable vectors", &
GV); return; } } while (false)
829 "Globals cannot contain scalable vectors", &GV)do { if (!(!isa<ScalableVectorType>(GV.getValueType()))
) { CheckFailed("Globals cannot contain scalable vectors", &
GV); return; } } while (false)
;
830
831 if (auto *STy = dyn_cast<StructType>(GV.getValueType()))
832 Check(!STy->containsScalableVectorType(),do { if (!(!STy->containsScalableVectorType())) { CheckFailed
("Globals cannot contain scalable vectors", &GV); return;
} } while (false)
833 "Globals cannot contain scalable vectors", &GV)do { if (!(!STy->containsScalableVectorType())) { CheckFailed
("Globals cannot contain scalable vectors", &GV); return;
} } while (false)
;
834
835 // Check if it's a target extension type that disallows being used as a
836 // global.
837 if (auto *TTy = dyn_cast<TargetExtType>(GV.getValueType()))
838 Check(TTy->hasProperty(TargetExtType::CanBeGlobal),do { if (!(TTy->hasProperty(TargetExtType::CanBeGlobal))) {
CheckFailed("Global @" + GV.getName() + " has illegal target extension type"
, TTy); return; } } while (false)
839 "Global @" + GV.getName() + " has illegal target extension type",do { if (!(TTy->hasProperty(TargetExtType::CanBeGlobal))) {
CheckFailed("Global @" + GV.getName() + " has illegal target extension type"
, TTy); return; } } while (false)
840 TTy)do { if (!(TTy->hasProperty(TargetExtType::CanBeGlobal))) {
CheckFailed("Global @" + GV.getName() + " has illegal target extension type"
, TTy); return; } } while (false)
;
841
842 if (!GV.hasInitializer()) {
843 visitGlobalValue(GV);
844 return;
845 }
846
847 // Walk any aggregate initializers looking for bitcasts between address spaces
848 visitConstantExprsRecursively(GV.getInitializer());
849
850 visitGlobalValue(GV);
851}
852
853void Verifier::visitAliaseeSubExpr(const GlobalAlias &GA, const Constant &C) {
854 SmallPtrSet<const GlobalAlias*, 4> Visited;
855 Visited.insert(&GA);
856 visitAliaseeSubExpr(Visited, GA, C);
857}
858
859void Verifier::visitAliaseeSubExpr(SmallPtrSetImpl<const GlobalAlias*> &Visited,
860 const GlobalAlias &GA, const Constant &C) {
861 if (GA.hasAvailableExternallyLinkage()) {
862 Check(isa<GlobalValue>(C) &&do { if (!(isa<GlobalValue>(C) && cast<GlobalValue
>(C).hasAvailableExternallyLinkage())) { CheckFailed("available_externally alias must point to available_externally "
"global value", &GA); return; } } while (false)
863 cast<GlobalValue>(C).hasAvailableExternallyLinkage(),do { if (!(isa<GlobalValue>(C) && cast<GlobalValue
>(C).hasAvailableExternallyLinkage())) { CheckFailed("available_externally alias must point to available_externally "
"global value", &GA); return; } } while (false)
864 "available_externally alias must point to available_externally "do { if (!(isa<GlobalValue>(C) && cast<GlobalValue
>(C).hasAvailableExternallyLinkage())) { CheckFailed("available_externally alias must point to available_externally "
"global value", &GA); return; } } while (false)
865 "global value",do { if (!(isa<GlobalValue>(C) && cast<GlobalValue
>(C).hasAvailableExternallyLinkage())) { CheckFailed("available_externally alias must point to available_externally "
"global value", &GA); return; } } while (false)
866 &GA)do { if (!(isa<GlobalValue>(C) && cast<GlobalValue
>(C).hasAvailableExternallyLinkage())) { CheckFailed("available_externally alias must point to available_externally "
"global value", &GA); return; } } while (false)
;
867 }
868 if (const auto *GV = dyn_cast<GlobalValue>(&C)) {
869 if (!GA.hasAvailableExternallyLinkage()) {
870 Check(!GV->isDeclarationForLinker(), "Alias must point to a definition",do { if (!(!GV->isDeclarationForLinker())) { CheckFailed("Alias must point to a definition"
, &GA); return; } } while (false)
871 &GA)do { if (!(!GV->isDeclarationForLinker())) { CheckFailed("Alias must point to a definition"
, &GA); return; } } while (false)
;
872 }
873
874 if (const auto *GA2 = dyn_cast<GlobalAlias>(GV)) {
875 Check(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 (false)
;
876
877 Check(!GA2->isInterposable(),do { if (!(!GA2->isInterposable())) { CheckFailed("Alias cannot point to an interposable alias"
, &GA); return; } } while (false)
878 "Alias cannot point to an interposable alias", &GA)do { if (!(!GA2->isInterposable())) { CheckFailed("Alias cannot point to an interposable alias"
, &GA); return; } } while (false)
;
879 } else {
880 // Only continue verifying subexpressions of GlobalAliases.
881 // Do not recurse into global initializers.
882 return;
883 }
884 }
885
886 if (const auto *CE = dyn_cast<ConstantExpr>(&C))
887 visitConstantExprsRecursively(CE);
888
889 for (const Use &U : C.operands()) {
890 Value *V = &*U;
891 if (const auto *GA2 = dyn_cast<GlobalAlias>(V))
892 visitAliaseeSubExpr(Visited, GA, *GA2->getAliasee());
893 else if (const auto *C2 = dyn_cast<Constant>(V))
894 visitAliaseeSubExpr(Visited, GA, *C2);
895 }
896}
897
898void Verifier::visitGlobalAlias(const GlobalAlias &GA) {
899 Check(GlobalAlias::isValidLinkage(GA.getLinkage()),do { if (!(GlobalAlias::isValidLinkage(GA.getLinkage()))) { CheckFailed
("Alias should have private, internal, linkonce, weak, linkonce_odr, "
"weak_odr, external, or available_externally linkage!", &
GA); return; } } while (false)
900 "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, external, or available_externally linkage!", &
GA); return; } } while (false)
901 "weak_odr, external, or available_externally linkage!",do { if (!(GlobalAlias::isValidLinkage(GA.getLinkage()))) { CheckFailed
("Alias should have private, internal, linkonce, weak, linkonce_odr, "
"weak_odr, external, or available_externally linkage!", &
GA); return; } } while (false)
902 &GA)do { if (!(GlobalAlias::isValidLinkage(GA.getLinkage()))) { CheckFailed
("Alias should have private, internal, linkonce, weak, linkonce_odr, "
"weak_odr, external, or available_externally linkage!", &
GA); return; } } while (false)
;
903 const Constant *Aliasee = GA.getAliasee();
904 Check(Aliasee, "Aliasee cannot be NULL!", &GA)do { if (!(Aliasee)) { CheckFailed("Aliasee cannot be NULL!",
&GA); return; } } while (false)
;
905 Check(GA.getType() == Aliasee->getType(),do { if (!(GA.getType() == Aliasee->getType())) { CheckFailed
("Alias and aliasee types should match!", &GA); return; }
} while (false)
906 "Alias and aliasee types should match!", &GA)do { if (!(GA.getType() == Aliasee->getType())) { CheckFailed
("Alias and aliasee types should match!", &GA); return; }
} while (false)
;
907
908 Check(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 (false)
909 "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 (false)
;
910
911 visitAliaseeSubExpr(GA, *Aliasee);
912
913 visitGlobalValue(GA);
914}
915
916void Verifier::visitGlobalIFunc(const GlobalIFunc &GI) {
917 Check(GlobalIFunc::isValidLinkage(GI.getLinkage()),do { if (!(GlobalIFunc::isValidLinkage(GI.getLinkage()))) { CheckFailed
("IFunc should have private, internal, linkonce, weak, linkonce_odr, "
"weak_odr, or external linkage!", &GI); return; } } while
(false)
918 "IFunc should have private, internal, linkonce, weak, linkonce_odr, "do { if (!(GlobalIFunc::isValidLinkage(GI.getLinkage()))) { CheckFailed
("IFunc should have private, internal, linkonce, weak, linkonce_odr, "
"weak_odr, or external linkage!", &GI); return; } } while
(false)
919 "weak_odr, or external linkage!",do { if (!(GlobalIFunc::isValidLinkage(GI.getLinkage()))) { CheckFailed
("IFunc should have private, internal, linkonce, weak, linkonce_odr, "
"weak_odr, or external linkage!", &GI); return; } } while
(false)
920 &GI)do { if (!(GlobalIFunc::isValidLinkage(GI.getLinkage()))) { CheckFailed
("IFunc should have private, internal, linkonce, weak, linkonce_odr, "
"weak_odr, or external linkage!", &GI); return; } } while
(false)
;
921 // Pierce through ConstantExprs and GlobalAliases and check that the resolver
922 // is a Function definition.
923 const Function *Resolver = GI.getResolverFunction();
924 Check(Resolver, "IFunc must have a Function resolver", &GI)do { if (!(Resolver)) { CheckFailed("IFunc must have a Function resolver"
, &GI); return; } } while (false)
;
925 Check(!Resolver->isDeclarationForLinker(),do { if (!(!Resolver->isDeclarationForLinker())) { CheckFailed
("IFunc resolver must be a definition", &GI); return; } }
while (false)
926 "IFunc resolver must be a definition", &GI)do { if (!(!Resolver->isDeclarationForLinker())) { CheckFailed
("IFunc resolver must be a definition", &GI); return; } }
while (false)
;
927
928 // Check that the immediate resolver operand (prior to any bitcasts) has the
929 // correct type.
930 const Type *ResolverTy = GI.getResolver()->getType();
931
932 Check(isa<PointerType>(Resolver->getFunctionType()->getReturnType()),do { if (!(isa<PointerType>(Resolver->getFunctionType
()->getReturnType()))) { CheckFailed("IFunc resolver must return a pointer"
, &GI); return; } } while (false)
933 "IFunc resolver must return a pointer", &GI)do { if (!(isa<PointerType>(Resolver->getFunctionType
()->getReturnType()))) { CheckFailed("IFunc resolver must return a pointer"
, &GI); return; } } while (false)
;
934
935 const Type *ResolverFuncTy =
936 GlobalIFunc::getResolverFunctionType(GI.getValueType());
937 Check(ResolverTy == ResolverFuncTy->getPointerTo(GI.getAddressSpace()),do { if (!(ResolverTy == ResolverFuncTy->getPointerTo(GI.getAddressSpace
()))) { CheckFailed("IFunc resolver has incorrect type", &
GI); return; } } while (false)
938 "IFunc resolver has incorrect type", &GI)do { if (!(ResolverTy == ResolverFuncTy->getPointerTo(GI.getAddressSpace
()))) { CheckFailed("IFunc resolver has incorrect type", &
GI); return; } } while (false)
;
939}
940
941void Verifier::visitNamedMDNode(const NamedMDNode &NMD) {
942 // There used to be various other llvm.dbg.* nodes, but we don't support
943 // upgrading them and we want to reserve the namespace for future uses.
944 if (NMD.getName().startswith("llvm.dbg."))
945 CheckDI(NMD.getName() == "llvm.dbg.cu",do { if (!(NMD.getName() == "llvm.dbg.cu")) { DebugInfoCheckFailed
("unrecognized named metadata node in the llvm.dbg namespace"
, &NMD); return; } } while (false)
946 "unrecognized named metadata node in the llvm.dbg namespace", &NMD)do { if (!(NMD.getName() == "llvm.dbg.cu")) { DebugInfoCheckFailed
("unrecognized named metadata node in the llvm.dbg namespace"
, &NMD); return; } } while (false)
;
947 for (const MDNode *MD : NMD.operands()) {
948 if (NMD.getName() == "llvm.dbg.cu")
949 CheckDI(MD && isa<DICompileUnit>(MD), "invalid compile unit", &NMD, MD)do { if (!(MD && isa<DICompileUnit>(MD))) { DebugInfoCheckFailed
("invalid compile unit", &NMD, MD); return; } } while (false
)
;
950
951 if (!MD)
952 continue;
953
954 visitMDNode(*MD, AreDebugLocsAllowed::Yes);
955 }
956}
957
958void Verifier::visitMDNode(const MDNode &MD, AreDebugLocsAllowed AllowLocs) {
959 // Only visit each node once. Metadata can be mutually recursive, so this
960 // avoids infinite recursion here, as well as being an optimization.
961 if (!MDNodes.insert(&MD).second)
962 return;
963
964 Check(&MD.getContext() == &Context,do { if (!(&MD.getContext() == &Context)) { CheckFailed
("MDNode context does not match Module context!", &MD); return
; } } while (false)
965 "MDNode context does not match Module context!", &MD)do { if (!(&MD.getContext() == &Context)) { CheckFailed
("MDNode context does not match Module context!", &MD); return
; } } while (false)
;
966
967 switch (MD.getMetadataID()) {
968 default:
969 llvm_unreachable("Invalid MDNode subclass")::llvm::llvm_unreachable_internal("Invalid MDNode subclass", "llvm/lib/IR/Verifier.cpp"
, 969)
;
970 case Metadata::MDTupleKind:
971 break;
972#define HANDLE_SPECIALIZED_MDNODE_LEAF(CLASS) \
973 case Metadata::CLASS##Kind: \
974 visit##CLASS(cast<CLASS>(MD)); \
975 break;
976#include "llvm/IR/Metadata.def"
977 }
978
979 for (const Metadata *Op : MD.operands()) {
980 if (!Op)
981 continue;
982 Check(!isa<LocalAsMetadata>(Op), "Invalid operand for global metadata!",do { if (!(!isa<LocalAsMetadata>(Op))) { CheckFailed("Invalid operand for global metadata!"
, &MD, Op); return; } } while (false)
983 &MD, Op)do { if (!(!isa<LocalAsMetadata>(Op))) { CheckFailed("Invalid operand for global metadata!"
, &MD, Op); return; } } while (false)
;
984 CheckDI(!isa<DILocation>(Op) || AllowLocs == AreDebugLocsAllowed::Yes,do { if (!(!isa<DILocation>(Op) || AllowLocs == AreDebugLocsAllowed
::Yes)) { DebugInfoCheckFailed("DILocation not allowed within this metadata node"
, &MD, Op); return; } } while (false)
985 "DILocation not allowed within this metadata node", &MD, Op)do { if (!(!isa<DILocation>(Op) || AllowLocs == AreDebugLocsAllowed
::Yes)) { DebugInfoCheckFailed("DILocation not allowed within this metadata node"
, &MD, Op); return; } } while (false)
;
986 if (auto *N = dyn_cast<MDNode>(Op)) {
987 visitMDNode(*N, AllowLocs);
988 continue;
989 }
990 if (auto *V = dyn_cast<ValueAsMetadata>(Op)) {
991 visitValueAsMetadata(*V, nullptr);
992 continue;
993 }
994 }
995
996 // Check these last, so we diagnose problems in operands first.
997 Check(!MD.isTemporary(), "Expected no forward declarations!", &MD)do { if (!(!MD.isTemporary())) { CheckFailed("Expected no forward declarations!"
, &MD); return; } } while (false)
;
998 Check(MD.isResolved(), "All nodes should be resolved!", &MD)do { if (!(MD.isResolved())) { CheckFailed("All nodes should be resolved!"
, &MD); return; } } while (false)
;
999}
1000
1001void Verifier::visitValueAsMetadata(const ValueAsMetadata &MD, Function *F) {
1002 Check(MD.getValue(), "Expected valid value", &MD)do { if (!(MD.getValue())) { CheckFailed("Expected valid value"
, &MD); return; } } while (false)
;
1003 Check(!MD.getValue()->getType()->isMetadataTy(),do { if (!(!MD.getValue()->getType()->isMetadataTy())) {
CheckFailed("Unexpected metadata round-trip through values",
&MD, MD.getValue()); return; } } while (false)
1004 "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 (false)
;
1005
1006 auto *L = dyn_cast<LocalAsMetadata>(&MD);
1007 if (!L)
1008 return;
1009
1010 Check(F, "function-local metadata used outside a function", L)do { if (!(F)) { CheckFailed("function-local metadata used outside a function"
, L); return; } } while (false)
;
1011
1012 // If this was an instruction, bb, or argument, verify that it is in the
1013 // function that we expect.
1014 Function *ActualF = nullptr;
1015 if (Instruction *I = dyn_cast<Instruction>(L->getValue())) {
1016 Check(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 (false)
;
1017 ActualF = I->getParent()->getParent();
1018 } else if (BasicBlock *BB = dyn_cast<BasicBlock>(L->getValue()))
1019 ActualF = BB->getParent();
1020 else if (Argument *A = dyn_cast<Argument>(L->getValue()))
1021 ActualF = A->getParent();
1022 assert(ActualF && "Unimplemented function local metadata case!")(static_cast <bool> (ActualF && "Unimplemented function local metadata case!"
) ? void (0) : __assert_fail ("ActualF && \"Unimplemented function local metadata case!\""
, "llvm/lib/IR/Verifier.cpp", 1022, __extension__ __PRETTY_FUNCTION__
))
;
1023
1024 Check(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 (false)
;
1025}
1026
1027void Verifier::visitMetadataAsValue(const MetadataAsValue &MDV, Function *F) {
1028 Metadata *MD = MDV.getMetadata();
1029 if (auto *N = dyn_cast<MDNode>(MD)) {
1030 visitMDNode(*N, AreDebugLocsAllowed::No);
1031 return;
1032 }
1033
1034 // Only visit each node once. Metadata can be mutually recursive, so this
1035 // avoids infinite recursion here, as well as being an optimization.
1036 if (!MDNodes.insert(MD).second)
1037 return;
1038
1039 if (auto *V = dyn_cast<ValueAsMetadata>(MD))
1040 visitValueAsMetadata(*V, F);
1041}
1042
1043static bool isType(const Metadata *MD) { return !MD || isa<DIType>(MD); }
1044static bool isScope(const Metadata *MD) { return !MD || isa<DIScope>(MD); }
1045static bool isDINode(const Metadata *MD) { return !MD || isa<DINode>(MD); }
1046
1047void Verifier::visitDILocation(const DILocation &N) {
1048 CheckDI(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 (false)
1049 "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 (false)
;
1050 if (auto *IA = N.getRawInlinedAt())
1051 CheckDI(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
(false)
;
1052 if (auto *SP = dyn_cast<DISubprogram>(N.getRawScope()))
1053 CheckDI(SP->isDefinition(), "scope points into the type hierarchy", &N)do { if (!(SP->isDefinition())) { DebugInfoCheckFailed("scope points into the type hierarchy"
, &N); return; } } while (false)
;
1054}
1055
1056void Verifier::visitGenericDINode(const GenericDINode &N) {
1057 CheckDI(N.getTag(), "invalid tag", &N)do { if (!(N.getTag())) { DebugInfoCheckFailed("invalid tag",
&N); return; } } while (false)
;
1058}
1059
1060void Verifier::visitDIScope(const DIScope &N) {
1061 if (auto *F = N.getRawFile())
1062 CheckDI(isa<DIFile>(F), "invalid file", &N, F)do { if (!(isa<DIFile>(F))) { DebugInfoCheckFailed("invalid file"
, &N, F); return; } } while (false)
;
1063}
1064
1065void Verifier::visitDISubrange(const DISubrange &N) {
1066 CheckDI(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 (false)
;
1067 bool HasAssumedSizedArraySupport = dwarf::isFortran(CurrentSourceLang);
1068 CheckDI(HasAssumedSizedArraySupport || N.getRawCountNode() ||do { if (!(HasAssumedSizedArraySupport || N.getRawCountNode()
|| N.getRawUpperBound())) { DebugInfoCheckFailed("Subrange must contain count or upperBound"
, &N); return; } } while (false)
1069 N.getRawUpperBound(),do { if (!(HasAssumedSizedArraySupport || N.getRawCountNode()
|| N.getRawUpperBound())) { DebugInfoCheckFailed("Subrange must contain count or upperBound"
, &N); return; } } while (false)
1070 "Subrange must contain count or upperBound", &N)do { if (!(HasAssumedSizedArraySupport || N.getRawCountNode()
|| N.getRawUpperBound())) { DebugInfoCheckFailed("Subrange must contain count or upperBound"
, &N); return; } } while (false)
;
1071 CheckDI(!N.getRawCountNode() || !N.getRawUpperBound(),do { if (!(!N.getRawCountNode() || !N.getRawUpperBound())) { DebugInfoCheckFailed
("Subrange can have any one of count or upperBound", &N);
return; } } while (false)
1072 "Subrange can have any one of count or upperBound", &N)do { if (!(!N.getRawCountNode() || !N.getRawUpperBound())) { DebugInfoCheckFailed
("Subrange can have any one of count or upperBound", &N);
return; } } while (false)
;
1073 auto *CBound = N.getRawCountNode();
1074 CheckDI(!CBound || isa<ConstantAsMetadata>(CBound) ||do { if (!(!CBound || isa<ConstantAsMetadata>(CBound) ||
isa<DIVariable>(CBound) || isa<DIExpression>(CBound
))) { DebugInfoCheckFailed("Count must be signed constant or DIVariable or DIExpression"
, &N); return; } } while (false)
1075 isa<DIVariable>(CBound) || isa<DIExpression>(CBound),do { if (!(!CBound || isa<ConstantAsMetadata>(CBound) ||
isa<DIVariable>(CBound) || isa<DIExpression>(CBound
))) { DebugInfoCheckFailed("Count must be signed constant or DIVariable or DIExpression"
, &N); return; } } while (false)
1076 "Count must be signed constant or DIVariable or DIExpression", &N)do { if (!(!CBound || isa<ConstantAsMetadata>(CBound) ||
isa<DIVariable>(CBound) || isa<DIExpression>(CBound
))) { DebugInfoCheckFailed("Count must be signed constant or DIVariable or DIExpression"
, &N); return; } } while (false)
;
1077 auto Count = N.getCount();
1078 CheckDI(!Count || !isa<ConstantInt *>(Count) ||do { if (!(!Count || !isa<ConstantInt *>(Count) || cast
<ConstantInt *>(Count)->getSExtValue() >= -1)) { DebugInfoCheckFailed
("invalid subrange count", &N); return; } } while (false)
1079 cast<ConstantInt *>(Count)->getSExtValue() >= -1,do { if (!(!Count || !isa<ConstantInt *>(Count) || cast
<ConstantInt *>(Count)->getSExtValue() >= -1)) { DebugInfoCheckFailed
("invalid subrange count", &N); return; } } while (false)
1080 "invalid subrange count", &N)do { if (!(!Count || !isa<ConstantInt *>(Count) || cast
<ConstantInt *>(Count)->getSExtValue() >= -1)) { DebugInfoCheckFailed
("invalid subrange count", &N); return; } } while (false)
;
1081 auto *LBound = N.getRawLowerBound();
1082 CheckDI(!LBound || isa<ConstantAsMetadata>(LBound) ||do { if (!(!LBound || isa<ConstantAsMetadata>(LBound) ||
isa<DIVariable>(LBound) || isa<DIExpression>(LBound
))) { DebugInfoCheckFailed("LowerBound must be signed constant or DIVariable or DIExpression"
, &N); return; } } while (false)
1083 isa<DIVariable>(LBound) || isa<DIExpression>(LBound),do { if (!(!LBound || isa<ConstantAsMetadata>(LBound) ||
isa<DIVariable>(LBound) || isa<DIExpression>(LBound
))) { DebugInfoCheckFailed("LowerBound must be signed constant or DIVariable or DIExpression"
, &N); return; } } while (false)
1084 "LowerBound must be signed constant or DIVariable or DIExpression",do { if (!(!LBound || isa<ConstantAsMetadata>(LBound) ||
isa<DIVariable>(LBound) || isa<DIExpression>(LBound
))) { DebugInfoCheckFailed("LowerBound must be signed constant or DIVariable or DIExpression"
, &N); return; } } while (false)
1085 &N)do { if (!(!LBound || isa<ConstantAsMetadata>(LBound) ||
isa<DIVariable>(LBound) || isa<DIExpression>(LBound
))) { DebugInfoCheckFailed("LowerBound must be signed constant or DIVariable or DIExpression"
, &N); return; } } while (false)
;
1086 auto *UBound = N.getRawUpperBound();
1087 CheckDI(!UBound || isa<ConstantAsMetadata>(UBound) ||do { if (!(!UBound || isa<ConstantAsMetadata>(UBound) ||
isa<DIVariable>(UBound) || isa<DIExpression>(UBound
))) { DebugInfoCheckFailed("UpperBound must be signed constant or DIVariable or DIExpression"
, &N); return; } } while (false)
1088 isa<DIVariable>(UBound) || isa<DIExpression>(UBound),do { if (!(!UBound || isa<ConstantAsMetadata>(UBound) ||
isa<DIVariable>(UBound) || isa<DIExpression>(UBound
))) { DebugInfoCheckFailed("UpperBound must be signed constant or DIVariable or DIExpression"
, &N); return; } } while (false)
1089 "UpperBound must be signed constant or DIVariable or DIExpression",do { if (!(!UBound || isa<ConstantAsMetadata>(UBound) ||
isa<DIVariable>(UBound) || isa<DIExpression>(UBound
))) { DebugInfoCheckFailed("UpperBound must be signed constant or DIVariable or DIExpression"
, &N); return; } } while (false)
1090 &N)do { if (!(!UBound || isa<ConstantAsMetadata>(UBound) ||
isa<DIVariable>(UBound) || isa<DIExpression>(UBound
))) { DebugInfoCheckFailed("UpperBound must be signed constant or DIVariable or DIExpression"
, &N); return; } } while (false)
;
1091 auto *Stride = N.getRawStride();
1092 CheckDI(!Stride || isa<ConstantAsMetadata>(Stride) ||do { if (!(!Stride || isa<ConstantAsMetadata>(Stride) ||
isa<DIVariable>(Stride) || isa<DIExpression>(Stride
))) { DebugInfoCheckFailed("Stride must be signed constant or DIVariable or DIExpression"
, &N); return; } } while (false)
1093 isa<DIVariable>(Stride) || isa<DIExpression>(Stride),do { if (!(!Stride || isa<ConstantAsMetadata>(Stride) ||
isa<DIVariable>(Stride) || isa<DIExpression>(Stride
))) { DebugInfoCheckFailed("Stride must be signed constant or DIVariable or DIExpression"
, &N); return; } } while (false)
1094 "Stride must be signed constant or DIVariable or DIExpression", &N)do { if (!(!Stride || isa<ConstantAsMetadata>(Stride) ||
isa<DIVariable>(Stride) || isa<DIExpression>(Stride
))) { DebugInfoCheckFailed("Stride must be signed constant or DIVariable or DIExpression"
, &N); return; } } while (false)
;
1095}
1096
1097void Verifier::visitDIGenericSubrange(const DIGenericSubrange &N) {
1098 CheckDI(N.getTag() == dwarf::DW_TAG_generic_subrange, "invalid tag", &N)do { if (!(N.getTag() == dwarf::DW_TAG_generic_subrange)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (false)
;
1099 CheckDI(N.getRawCountNode() || N.getRawUpperBound(),do { if (!(N.getRawCountNode() || N.getRawUpperBound())) { DebugInfoCheckFailed
("GenericSubrange must contain count or upperBound", &N);
return; } } while (false)
1100 "GenericSubrange must contain count or upperBound", &N)do { if (!(N.getRawCountNode() || N.getRawUpperBound())) { DebugInfoCheckFailed
("GenericSubrange must contain count or upperBound", &N);
return; } } while (false)
;
1101 CheckDI(!N.getRawCountNode() || !N.getRawUpperBound(),do { if (!(!N.getRawCountNode() || !N.getRawUpperBound())) { DebugInfoCheckFailed
("GenericSubrange can have any one of count or upperBound", &
N); return; } } while (false)
1102 "GenericSubrange can have any one of count or upperBound", &N)do { if (!(!N.getRawCountNode() || !N.getRawUpperBound())) { DebugInfoCheckFailed
("GenericSubrange can have any one of count or upperBound", &
N); return; } } while (false)
;
1103 auto *CBound = N.getRawCountNode();
1104 CheckDI(!CBound || isa<DIVariable>(CBound) || isa<DIExpression>(CBound),do { if (!(!CBound || isa<DIVariable>(CBound) || isa<
DIExpression>(CBound))) { DebugInfoCheckFailed("Count must be signed constant or DIVariable or DIExpression"
, &N); return; } } while (false)
1105 "Count must be signed constant or DIVariable or DIExpression", &N)do { if (!(!CBound || isa<DIVariable>(CBound) || isa<
DIExpression>(CBound))) { DebugInfoCheckFailed("Count must be signed constant or DIVariable or DIExpression"
, &N); return; } } while (false)
;
1106 auto *LBound = N.getRawLowerBound();
1107 CheckDI(LBound, "GenericSubrange must contain lowerBound", &N)do { if (!(LBound)) { DebugInfoCheckFailed("GenericSubrange must contain lowerBound"
, &N); return; } } while (false)
;
1108 CheckDI(isa<DIVariable>(LBound) || isa<DIExpression>(LBound),do { if (!(isa<DIVariable>(LBound) || isa<DIExpression
>(LBound))) { DebugInfoCheckFailed("LowerBound must be signed constant or DIVariable or DIExpression"
, &N); return; } } while (false)
1109 "LowerBound must be signed constant or DIVariable or DIExpression",do { if (!(isa<DIVariable>(LBound) || isa<DIExpression
>(LBound))) { DebugInfoCheckFailed("LowerBound must be signed constant or DIVariable or DIExpression"
, &N); return; } } while (false)
1110 &N)do { if (!(isa<DIVariable>(LBound) || isa<DIExpression
>(LBound))) { DebugInfoCheckFailed("LowerBound must be signed constant or DIVariable or DIExpression"
, &N); return; } } while (false)
;
1111 auto *UBound = N.getRawUpperBound();
1112 CheckDI(!UBound || isa<DIVariable>(UBound) || isa<DIExpression>(UBound),do { if (!(!UBound || isa<DIVariable>(UBound) || isa<
DIExpression>(UBound))) { DebugInfoCheckFailed("UpperBound must be signed constant or DIVariable or DIExpression"
, &N); return; } } while (false)
1113 "UpperBound must be signed constant or DIVariable or DIExpression",do { if (!(!UBound || isa<DIVariable>(UBound) || isa<
DIExpression>(UBound))) { DebugInfoCheckFailed("UpperBound must be signed constant or DIVariable or DIExpression"
, &N); return; } } while (false)
1114 &N)do { if (!(!UBound || isa<DIVariable>(UBound) || isa<
DIExpression>(UBound))) { DebugInfoCheckFailed("UpperBound must be signed constant or DIVariable or DIExpression"
, &N); return; } } while (false)
;
1115 auto *Stride = N.getRawStride();
1116 CheckDI(Stride, "GenericSubrange must contain stride", &N)do { if (!(Stride)) { DebugInfoCheckFailed("GenericSubrange must contain stride"
, &N); return; } } while (false)
;
1117 CheckDI(isa<DIVariable>(Stride) || isa<DIExpression>(Stride),do { if (!(isa<DIVariable>(Stride) || isa<DIExpression
>(Stride))) { DebugInfoCheckFailed("Stride must be signed constant or DIVariable or DIExpression"
, &N); return; } } while (false)
1118 "Stride must be signed constant or DIVariable or DIExpression", &N)do { if (!(isa<DIVariable>(Stride) || isa<DIExpression
>(Stride))) { DebugInfoCheckFailed("Stride must be signed constant or DIVariable or DIExpression"
, &N); return; } } while (false)
;
1119}
1120
1121void Verifier::visitDIEnumerator(const DIEnumerator &N) {
1122 CheckDI(N.getTag() == dwarf::DW_TAG_enumerator, "invalid tag", &N)do { if (!(N.getTag() == dwarf::DW_TAG_enumerator)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (false)
;
1123}
1124
1125void Verifier::visitDIBasicType(const DIBasicType &N) {
1126 CheckDI(N.getTag() == dwarf::DW_TAG_base_type ||do { if (!(N.getTag() == dwarf::DW_TAG_base_type || N.getTag(
) == dwarf::DW_TAG_unspecified_type || N.getTag() == dwarf::DW_TAG_string_type
)) { DebugInfoCheckFailed("invalid tag", &N); return; } }
while (false)
1127 N.getTag() == dwarf::DW_TAG_unspecified_type ||do { if (!(N.getTag() == dwarf::DW_TAG_base_type || N.getTag(
) == dwarf::DW_TAG_unspecified_type || N.getTag() == dwarf::DW_TAG_string_type
)) { DebugInfoCheckFailed("invalid tag", &N); return; } }
while (false)
1128 N.getTag() == dwarf::DW_TAG_string_type,do { if (!(N.getTag() == dwarf::DW_TAG_base_type || N.getTag(
) == dwarf::DW_TAG_unspecified_type || N.getTag() == dwarf::DW_TAG_string_type
)) { DebugInfoCheckFailed("invalid tag", &N); return; } }
while (false)
1129 "invalid tag", &N)do { if (!(N.getTag() == dwarf::DW_TAG_base_type || N.getTag(
) == dwarf::DW_TAG_unspecified_type || N.getTag() == dwarf::DW_TAG_string_type
)) { DebugInfoCheckFailed("invalid tag", &N); return; } }
while (false)
;
1130}
1131
1132void Verifier::visitDIStringType(const DIStringType &N) {
1133 CheckDI(N.getTag() == dwarf::DW_TAG_string_type, "invalid tag", &N)do { if (!(N.getTag() == dwarf::DW_TAG_string_type)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (false)
;
1134 CheckDI(!(N.isBigEndian() && N.isLittleEndian()), "has conflicting flags",do { if (!(!(N.isBigEndian() && N.isLittleEndian())))
{ DebugInfoCheckFailed("has conflicting flags", &N); return
; } } while (false)
1135 &N)do { if (!(!(N.isBigEndian() && N.isLittleEndian())))
{ DebugInfoCheckFailed("has conflicting flags", &N); return
; } } while (false)
;
1136}
1137
1138void Verifier::visitDIDerivedType(const DIDerivedType &N) {
1139 // Common scope checks.
1140 visitDIScope(N);
1141
1142 CheckDI(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_immutable_type
|| N.getTag() == dwarf::DW_TAG_volatile_type || N.getTag() ==
dwarf::DW_TAG_restrict_type || N.getTag() == dwarf::DW_TAG_atomic_type
|| N.getTag() == dwarf::DW_TAG_member || N.getTag() == dwarf
::DW_TAG_inheritance || N.getTag() == dwarf::DW_TAG_friend ||
N.getTag() == dwarf::DW_TAG_set_type)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (false)
1143 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_immutable_type
|| N.getTag() == dwarf::DW_TAG_volatile_type || N.getTag() ==
dwarf::DW_TAG_restrict_type || N.getTag() == dwarf::DW_TAG_atomic_type
|| N.getTag() == dwarf::DW_TAG_member || N.getTag() == dwarf
::DW_TAG_inheritance || N.getTag() == dwarf::DW_TAG_friend ||
N.getTag() == dwarf::DW_TAG_set_type)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (false)
1144 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_immutable_type
|| N.getTag() == dwarf::DW_TAG_volatile_type || N.getTag() ==
dwarf::DW_TAG_restrict_type || N.getTag() == dwarf::DW_TAG_atomic_type
|| N.getTag() == dwarf::DW_TAG_member || N.getTag() == dwarf
::DW_TAG_inheritance || N.getTag() == dwarf::DW_TAG_friend ||
N.getTag() == dwarf::DW_TAG_set_type)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (false)
1145 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_immutable_type
|| N.getTag() == dwarf::DW_TAG_volatile_type || N.getTag() ==
dwarf::DW_TAG_restrict_type || N.getTag() == dwarf::DW_TAG_atomic_type
|| N.getTag() == dwarf::DW_TAG_member || N.getTag() == dwarf
::DW_TAG_inheritance || N.getTag() == dwarf::DW_TAG_friend ||
N.getTag() == dwarf::DW_TAG_set_type)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (false)
1146 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_immutable_type
|| N.getTag() == dwarf::DW_TAG_volatile_type || N.getTag() ==
dwarf::DW_TAG_restrict_type || N.getTag() == dwarf::DW_TAG_atomic_type
|| N.getTag() == dwarf::DW_TAG_member || N.getTag() == dwarf
::DW_TAG_inheritance || N.getTag() == dwarf::DW_TAG_friend ||
N.getTag() == dwarf::DW_TAG_set_type)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (false)
1147 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_immutable_type
|| N.getTag() == dwarf::DW_TAG_volatile_type || N.getTag() ==
dwarf::DW_TAG_restrict_type || N.getTag() == dwarf::DW_TAG_atomic_type
|| N.getTag() == dwarf::DW_TAG_member || N.getTag() == dwarf
::DW_TAG_inheritance || N.getTag() == dwarf::DW_TAG_friend ||
N.getTag() == dwarf::DW_TAG_set_type)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (false)
1148 N.getTag() == dwarf::DW_TAG_immutable_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_immutable_type
|| N.getTag() == dwarf::DW_TAG_volatile_type || N.getTag() ==
dwarf::DW_TAG_restrict_type || N.getTag() == dwarf::DW_TAG_atomic_type
|| N.getTag() == dwarf::DW_TAG_member || N.getTag() == dwarf
::DW_TAG_inheritance || N.getTag() == dwarf::DW_TAG_friend ||
N.getTag() == dwarf::DW_TAG_set_type)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (false)
1149 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_immutable_type
|| N.getTag() == dwarf::DW_TAG_volatile_type || N.getTag() ==
dwarf::DW_TAG_restrict_type || N.getTag() == dwarf::DW_TAG_atomic_type
|| N.getTag() == dwarf::DW_TAG_member || N.getTag() == dwarf
::DW_TAG_inheritance || N.getTag() == dwarf::DW_TAG_friend ||
N.getTag() == dwarf::DW_TAG_set_type)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (false)
1150 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_immutable_type
|| N.getTag() == dwarf::DW_TAG_volatile_type || N.getTag() ==
dwarf::DW_TAG_restrict_type || N.getTag() == dwarf::DW_TAG_atomic_type
|| N.getTag() == dwarf::DW_TAG_member || N.getTag() == dwarf
::DW_TAG_inheritance || N.getTag() == dwarf::DW_TAG_friend ||
N.getTag() == dwarf::DW_TAG_set_type)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (false)
1151 N.getTag() == dwarf::DW_TAG_atomic_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_immutable_type
|| N.getTag() == dwarf::DW_TAG_volatile_type || N.getTag() ==
dwarf::DW_TAG_restrict_type || N.getTag() == dwarf::DW_TAG_atomic_type
|| N.getTag() == dwarf::DW_TAG_member || N.getTag() == dwarf
::DW_TAG_inheritance || N.getTag() == dwarf::DW_TAG_friend ||
N.getTag() == dwarf::DW_TAG_set_type)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (false)
1152 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_immutable_type
|| N.getTag() == dwarf::DW_TAG_volatile_type || N.getTag() ==
dwarf::DW_TAG_restrict_type || N.getTag() == dwarf::DW_TAG_atomic_type
|| N.getTag() == dwarf::DW_TAG_member || N.getTag() == dwarf
::DW_TAG_inheritance || N.getTag() == dwarf::DW_TAG_friend ||
N.getTag() == dwarf::DW_TAG_set_type)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (false)
1153 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_immutable_type
|| N.getTag() == dwarf::DW_TAG_volatile_type || N.getTag() ==
dwarf::DW_TAG_restrict_type || N.getTag() == dwarf::DW_TAG_atomic_type
|| N.getTag() == dwarf::DW_TAG_member || N.getTag() == dwarf
::DW_TAG_inheritance || N.getTag() == dwarf::DW_TAG_friend ||
N.getTag() == dwarf::DW_TAG_set_type)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (false)
1154 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_immutable_type
|| N.getTag() == dwarf::DW_TAG_volatile_type || N.getTag() ==
dwarf::DW_TAG_restrict_type || N.getTag() == dwarf::DW_TAG_atomic_type
|| N.getTag() == dwarf::DW_TAG_member || N.getTag() == dwarf
::DW_TAG_inheritance || N.getTag() == dwarf::DW_TAG_friend ||
N.getTag() == dwarf::DW_TAG_set_type)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (false)
1155 N.getTag() == dwarf::DW_TAG_set_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_immutable_type
|| N.getTag() == dwarf::DW_TAG_volatile_type || N.getTag() ==
dwarf::DW_TAG_restrict_type || N.getTag() == dwarf::DW_TAG_atomic_type
|| N.getTag() == dwarf::DW_TAG_member || N.getTag() == dwarf
::DW_TAG_inheritance || N.getTag() == dwarf::DW_TAG_friend ||
N.getTag() == dwarf::DW_TAG_set_type)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (false)
1156 "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_immutable_type
|| N.getTag() == dwarf::DW_TAG_volatile_type || N.getTag() ==
dwarf::DW_TAG_restrict_type || N.getTag() == dwarf::DW_TAG_atomic_type
|| N.getTag() == dwarf::DW_TAG_member || N.getTag() == dwarf
::DW_TAG_inheritance || N.getTag() == dwarf::DW_TAG_friend ||
N.getTag() == dwarf::DW_TAG_set_type)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (false)
;
1157 if (N.getTag() == dwarf::DW_TAG_ptr_to_member_type) {
1158 CheckDI(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 (false)
1159 N.getRawExtraData())do { if (!(isType(N.getRawExtraData()))) { DebugInfoCheckFailed
("invalid pointer to member type", &N, N.getRawExtraData(
)); return; } } while (false)
;
1160 }
1161
1162 if (N.getTag() == dwarf::DW_TAG_set_type) {
1163 if (auto *T = N.getRawBaseType()) {
1164 auto *Enum = dyn_cast_or_null<DICompositeType>(T);
1165 auto *Basic = dyn_cast_or_null<DIBasicType>(T);
1166 CheckDI(do { if (!((Enum && Enum->getTag() == dwarf::DW_TAG_enumeration_type
) || (Basic && (Basic->getEncoding() == dwarf::DW_ATE_unsigned
|| Basic->getEncoding() == dwarf::DW_ATE_signed || Basic->
getEncoding() == dwarf::DW_ATE_unsigned_char || Basic->getEncoding
() == dwarf::DW_ATE_signed_char || Basic->getEncoding() ==
dwarf::DW_ATE_boolean)))) { DebugInfoCheckFailed("invalid set base type"
, &N, T); return; } } while (false)
1167 (Enum && Enum->getTag() == dwarf::DW_TAG_enumeration_type) ||do { if (!((Enum && Enum->getTag() == dwarf::DW_TAG_enumeration_type
) || (Basic && (Basic->getEncoding() == dwarf::DW_ATE_unsigned
|| Basic->getEncoding() == dwarf::DW_ATE_signed || Basic->
getEncoding() == dwarf::DW_ATE_unsigned_char || Basic->getEncoding
() == dwarf::DW_ATE_signed_char || Basic->getEncoding() ==
dwarf::DW_ATE_boolean)))) { DebugInfoCheckFailed("invalid set base type"
, &N, T); return; } } while (false)
1168 (Basic && (Basic->getEncoding() == dwarf::DW_ATE_unsigned ||do { if (!((Enum && Enum->getTag() == dwarf::DW_TAG_enumeration_type
) || (Basic && (Basic->getEncoding() == dwarf::DW_ATE_unsigned
|| Basic->getEncoding() == dwarf::DW_ATE_signed || Basic->
getEncoding() == dwarf::DW_ATE_unsigned_char || Basic->getEncoding
() == dwarf::DW_ATE_signed_char || Basic->getEncoding() ==
dwarf::DW_ATE_boolean)))) { DebugInfoCheckFailed("invalid set base type"
, &N, T); return; } } while (false)
1169 Basic->getEncoding() == dwarf::DW_ATE_signed ||do { if (!((Enum && Enum->getTag() == dwarf::DW_TAG_enumeration_type
) || (Basic && (Basic->getEncoding() == dwarf::DW_ATE_unsigned
|| Basic->getEncoding() == dwarf::DW_ATE_signed || Basic->
getEncoding() == dwarf::DW_ATE_unsigned_char || Basic->getEncoding
() == dwarf::DW_ATE_signed_char || Basic->getEncoding() ==
dwarf::DW_ATE_boolean)))) { DebugInfoCheckFailed("invalid set base type"
, &N, T); return; } } while (false)
1170 Basic->getEncoding() == dwarf::DW_ATE_unsigned_char ||do { if (!((Enum && Enum->getTag() == dwarf::DW_TAG_enumeration_type
) || (Basic && (Basic->getEncoding() == dwarf::DW_ATE_unsigned
|| Basic->getEncoding() == dwarf::DW_ATE_signed || Basic->
getEncoding() == dwarf::DW_ATE_unsigned_char || Basic->getEncoding
() == dwarf::DW_ATE_signed_char || Basic->getEncoding() ==
dwarf::DW_ATE_boolean)))) { DebugInfoCheckFailed("invalid set base type"
, &N, T); return; } } while (false)
1171 Basic->getEncoding() == dwarf::DW_ATE_signed_char ||do { if (!((Enum && Enum->getTag() == dwarf::DW_TAG_enumeration_type
) || (Basic && (Basic->getEncoding() == dwarf::DW_ATE_unsigned
|| Basic->getEncoding() == dwarf::DW_ATE_signed || Basic->
getEncoding() == dwarf::DW_ATE_unsigned_char || Basic->getEncoding
() == dwarf::DW_ATE_signed_char || Basic->getEncoding() ==
dwarf::DW_ATE_boolean)))) { DebugInfoCheckFailed("invalid set base type"
, &N, T); return; } } while (false)
1172 Basic->getEncoding() == dwarf::DW_ATE_boolean)),do { if (!((Enum && Enum->getTag() == dwarf::DW_TAG_enumeration_type
) || (Basic && (Basic->getEncoding() == dwarf::DW_ATE_unsigned
|| Basic->getEncoding() == dwarf::DW_ATE_signed || Basic->
getEncoding() == dwarf::DW_ATE_unsigned_char || Basic->getEncoding
() == dwarf::DW_ATE_signed_char || Basic->getEncoding() ==
dwarf::DW_ATE_boolean)))) { DebugInfoCheckFailed("invalid set base type"
, &N, T); return; } } while (false)
1173 "invalid set base type", &N, T)do { if (!((Enum && Enum->getTag() == dwarf::DW_TAG_enumeration_type
) || (Basic && (Basic->getEncoding() == dwarf::DW_ATE_unsigned
|| Basic->getEncoding() == dwarf::DW_ATE_signed || Basic->
getEncoding() == dwarf::DW_ATE_unsigned_char || Basic->getEncoding
() == dwarf::DW_ATE_signed_char || Basic->getEncoding() ==
dwarf::DW_ATE_boolean)))) { DebugInfoCheckFailed("invalid set base type"
, &N, T); return; } } while (false)
;
1174 }
1175 }
1176
1177 CheckDI(isScope(N.getRawScope()), "invalid scope", &N, N.getRawScope())do { if (!(isScope(N.getRawScope()))) { DebugInfoCheckFailed(
"invalid scope", &N, N.getRawScope()); return; } } while (
false)
;
1178 CheckDI(isType(N.getRawBaseType()), "invalid base type", &N,do { if (!(isType(N.getRawBaseType()))) { DebugInfoCheckFailed
("invalid base type", &N, N.getRawBaseType()); return; } }
while (false)
1179 N.getRawBaseType())do { if (!(isType(N.getRawBaseType()))) { DebugInfoCheckFailed
("invalid base type", &N, N.getRawBaseType()); return; } }
while (false)
;
1180
1181 if (N.getDWARFAddressSpace()) {
1182 CheckDI(N.getTag() == dwarf::DW_TAG_pointer_type ||do { if (!(N.getTag() == dwarf::DW_TAG_pointer_type || N.getTag
() == dwarf::DW_TAG_reference_type || N.getTag() == dwarf::DW_TAG_rvalue_reference_type
)) { DebugInfoCheckFailed("DWARF address space only applies to pointer or reference types"
, &N); return; } } while (false)
1183 N.getTag() == dwarf::DW_TAG_reference_type ||do { if (!(N.getTag() == dwarf::DW_TAG_pointer_type || N.getTag
() == dwarf::DW_TAG_reference_type || N.getTag() == dwarf::DW_TAG_rvalue_reference_type
)) { DebugInfoCheckFailed("DWARF address space only applies to pointer or reference types"
, &N); return; } } while (false)
1184 N.getTag() == dwarf::DW_TAG_rvalue_reference_type,do { if (!(N.getTag() == dwarf::DW_TAG_pointer_type || N.getTag
() == dwarf::DW_TAG_reference_type || N.getTag() == dwarf::DW_TAG_rvalue_reference_type
)) { DebugInfoCheckFailed("DWARF address space only applies to pointer or reference types"
, &N); return; } } while (false)
1185 "DWARF address space only applies to pointer or reference types",do { if (!(N.getTag() == dwarf::DW_TAG_pointer_type || N.getTag
() == dwarf::DW_TAG_reference_type || N.getTag() == dwarf::DW_TAG_rvalue_reference_type
)) { DebugInfoCheckFailed("DWARF address space only applies to pointer or reference types"
, &N); return; } } while (false)
1186 &N)do { if (!(N.getTag() == dwarf::DW_TAG_pointer_type || N.getTag
() == dwarf::DW_TAG_reference_type || N.getTag() == dwarf::DW_TAG_rvalue_reference_type
)) { DebugInfoCheckFailed("DWARF address space only applies to pointer or reference types"
, &N); return; } } while (false)
;
1187 }
1188}
1189
1190/// Detect mutually exclusive flags.
1191static bool hasConflictingReferenceFlags(unsigned Flags) {
1192 return ((Flags & DINode::FlagLValueReference) &&
1193 (Flags & DINode::FlagRValueReference)) ||
1194 ((Flags & DINode::FlagTypePassByValue) &&
1195 (Flags & DINode::FlagTypePassByReference));
1196}
1197
1198void Verifier::visitTemplateParams(const MDNode &N, const Metadata &RawParams) {
1199 auto *Params = dyn_cast<MDTuple>(&RawParams);
1200 CheckDI(Params, "invalid template params", &N, &RawParams)do { if (!(Params)) { DebugInfoCheckFailed("invalid template params"
, &N, &RawParams); return; } } while (false)
;
1201 for (Metadata *Op : Params->operands()) {
1202 CheckDI(Op && isa<DITemplateParameter>(Op), "invalid template parameter",do { if (!(Op && isa<DITemplateParameter>(Op)))
{ DebugInfoCheckFailed("invalid template parameter", &N,
Params, Op); return; } } while (false)
1203 &N, Params, Op)do { if (!(Op && isa<DITemplateParameter>(Op)))
{ DebugInfoCheckFailed("invalid template parameter", &N,
Params, Op); return; } } while (false)
;
1204 }
1205}
1206
1207void Verifier::visitDICompositeType(const DICompositeType &N) {
1208 // Common scope checks.
1209 visitDIScope(N);
1210
1211 CheckDI(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 || N.getTag() == dwarf::DW_TAG_variant_part
|| N.getTag() == dwarf::DW_TAG_namelist)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (false)
1212 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 || N.getTag() == dwarf::DW_TAG_variant_part
|| N.getTag() == dwarf::DW_TAG_namelist)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (false)
1213 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 || N.getTag() == dwarf::DW_TAG_variant_part
|| N.getTag() == dwarf::DW_TAG_namelist)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (false)
1214 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 || N.getTag() == dwarf::DW_TAG_variant_part
|| N.getTag() == dwarf::DW_TAG_namelist)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (false)
1215 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 || N.getTag() == dwarf::DW_TAG_variant_part
|| N.getTag() == dwarf::DW_TAG_namelist)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (false)
1216 N.getTag() == dwarf::DW_TAG_variant_part ||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 || N.getTag() == dwarf::DW_TAG_variant_part
|| N.getTag() == dwarf::DW_TAG_namelist)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (false)
1217 N.getTag() == dwarf::DW_TAG_namelist,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 || N.getTag() == dwarf::DW_TAG_variant_part
|| N.getTag() == dwarf::DW_TAG_namelist)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (false)
1218 "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 || N.getTag() == dwarf::DW_TAG_variant_part
|| N.getTag() == dwarf::DW_TAG_namelist)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (false)
;
1219
1220 CheckDI(isScope(N.getRawScope()), "invalid scope", &N, N.getRawScope())do { if (!(isScope(N.getRawScope()))) { DebugInfoCheckFailed(
"invalid scope", &N, N.getRawScope()); return; } } while (
false)
;
1221 CheckDI(isType(N.getRawBaseType()), "invalid base type", &N,do { if (!(isType(N.getRawBaseType()))) { DebugInfoCheckFailed
("invalid base type", &N, N.getRawBaseType()); return; } }
while (false)
1222 N.getRawBaseType())do { if (!(isType(N.getRawBaseType()))) { DebugInfoCheckFailed
("invalid base type", &N, N.getRawBaseType()); return; } }
while (false)
;
1223
1224 CheckDI(!N.getRawElements() || isa<MDTuple>(N.getRawElements()),do { if (!(!N.getRawElements() || isa<MDTuple>(N.getRawElements
()))) { DebugInfoCheckFailed("invalid composite elements", &
N, N.getRawElements()); return; } } while (false)
1225 "invalid composite elements", &N, N.getRawElements())do { if (!(!N.getRawElements() || isa<MDTuple>(N.getRawElements
()))) { DebugInfoCheckFailed("invalid composite elements", &
N, N.getRawElements()); return; } } while (false)
;
1226 CheckDI(isType(N.getRawVTableHolder()), "invalid vtable holder", &N,do { if (!(isType(N.getRawVTableHolder()))) { DebugInfoCheckFailed
("invalid vtable holder", &N, N.getRawVTableHolder()); return
; } } while (false)
1227 N.getRawVTableHolder())do { if (!(isType(N.getRawVTableHolder()))) { DebugInfoCheckFailed
("invalid vtable holder", &N, N.getRawVTableHolder()); return
; } } while (false)
;
1228 CheckDI(!hasConflictingReferenceFlags(N.getFlags()),do { if (!(!hasConflictingReferenceFlags(N.getFlags()))) { DebugInfoCheckFailed
("invalid reference flags", &N); return; } } while (false
)
1229 "invalid reference flags", &N)do { if (!(!hasConflictingReferenceFlags(N.getFlags()))) { DebugInfoCheckFailed
("invalid reference flags", &N); return; } } while (false
)
;
1230 unsigned DIBlockByRefStruct = 1 << 4;
1231 CheckDI((N.getFlags() & DIBlockByRefStruct) == 0,do { if (!((N.getFlags() & DIBlockByRefStruct) == 0)) { DebugInfoCheckFailed
("DIBlockByRefStruct on DICompositeType is no longer supported"
, &N); return; } } while (false)
1232 "DIBlockByRefStruct on DICompositeType is no longer supported", &N)do { if (!((N.getFlags() & DIBlockByRefStruct) == 0)) { DebugInfoCheckFailed
("DIBlockByRefStruct on DICompositeType is no longer supported"
, &N); return; } } while (false)
;
1233
1234 if (N.isVector()) {
1235 const DINodeArray Elements = N.getElements();
1236 CheckDI(Elements.size() == 1 &&do { if (!(Elements.size() == 1 && Elements[0]->getTag
() == dwarf::DW_TAG_subrange_type)) { DebugInfoCheckFailed("invalid vector, expected one element of type subrange"
, &N); return; } } while (false)
1237 Elements[0]->getTag() == dwarf::DW_TAG_subrange_type,do { if (!(Elements.size() == 1 && Elements[0]->getTag
() == dwarf::DW_TAG_subrange_type)) { DebugInfoCheckFailed("invalid vector, expected one element of type subrange"
, &N); return; } } while (false)
1238 "invalid vector, expected one element of type subrange", &N)do { if (!(Elements.size() == 1 && Elements[0]->getTag
() == dwarf::DW_TAG_subrange_type)) { DebugInfoCheckFailed("invalid vector, expected one element of type subrange"
, &N); return; } } while (false)
;
1239 }
1240
1241 if (auto *Params = N.getRawTemplateParams())
1242 visitTemplateParams(N, *Params);
1243
1244 if (auto *D = N.getRawDiscriminator()) {
1245 CheckDI(isa<DIDerivedType>(D) && N.getTag() == dwarf::DW_TAG_variant_part,do { if (!(isa<DIDerivedType>(D) && N.getTag() ==
dwarf::DW_TAG_variant_part)) { DebugInfoCheckFailed("discriminator can only appear on variant part"
); return; } } while (false)
1246 "discriminator can only appear on variant part")do { if (!(isa<DIDerivedType>(D) && N.getTag() ==
dwarf::DW_TAG_variant_part)) { DebugInfoCheckFailed("discriminator can only appear on variant part"
); return; } } while (false)
;
1247 }
1248
1249 if (N.getRawDataLocation()) {
1250 CheckDI(N.getTag() == dwarf::DW_TAG_array_type,do { if (!(N.getTag() == dwarf::DW_TAG_array_type)) { DebugInfoCheckFailed
("dataLocation can only appear in array type"); return; } } while
(false)
1251 "dataLocation can only appear in array type")do { if (!(N.getTag() == dwarf::DW_TAG_array_type)) { DebugInfoCheckFailed
("dataLocation can only appear in array type"); return; } } while
(false)
;
1252 }
1253
1254 if (N.getRawAssociated()) {
1255 CheckDI(N.getTag() == dwarf::DW_TAG_array_type,do { if (!(N.getTag() == dwarf::DW_TAG_array_type)) { DebugInfoCheckFailed
("associated can only appear in array type"); return; } } while
(false)
1256 "associated can only appear in array type")do { if (!(N.getTag() == dwarf::DW_TAG_array_type)) { DebugInfoCheckFailed
("associated can only appear in array type"); return; } } while
(false)
;
1257 }
1258
1259 if (N.getRawAllocated()) {
1260 CheckDI(N.getTag() == dwarf::DW_TAG_array_type,do { if (!(N.getTag() == dwarf::DW_TAG_array_type)) { DebugInfoCheckFailed
("allocated can only appear in array type"); return; } } while
(false)
1261 "allocated can only appear in array type")do { if (!(N.getTag() == dwarf::DW_TAG_array_type)) { DebugInfoCheckFailed
("allocated can only appear in array type"); return; } } while
(false)
;
1262 }
1263
1264 if (N.getRawRank()) {
1265 CheckDI(N.getTag() == dwarf::DW_TAG_array_type,do { if (!(N.getTag() == dwarf::DW_TAG_array_type)) { DebugInfoCheckFailed
("rank can only appear in array type"); return; } } while (false
)
1266 "rank can only appear in array type")do { if (!(N.getTag() == dwarf::DW_TAG_array_type)) { DebugInfoCheckFailed
("rank can only appear in array type"); return; } } while (false
)
;
1267 }
1268}
1269
1270void Verifier::visitDISubroutineType(const DISubroutineType &N) {
1271 CheckDI(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 (false)
;
1272 if (auto *Types = N.getRawTypeArray()) {
1273 CheckDI(isa<MDTuple>(Types), "invalid composite elements", &N, Types)do { if (!(isa<MDTuple>(Types))) { DebugInfoCheckFailed
("invalid composite elements", &N, Types); return; } } while
(false)
;
1274 for (Metadata *Ty : N.getTypeArray()->operands()) {
1275 CheckDI(isType(Ty), "invalid subroutine type ref", &N, Types, Ty)do { if (!(isType(Ty))) { DebugInfoCheckFailed("invalid subroutine type ref"
, &N, Types, Ty); return; } } while (false)
;
1276 }
1277 }
1278 CheckDI(!hasConflictingReferenceFlags(N.getFlags()),do { if (!(!hasConflictingReferenceFlags(N.getFlags()))) { DebugInfoCheckFailed
("invalid reference flags", &N); return; } } while (false
)
1279 "invalid reference flags", &N)do { if (!(!hasConflictingReferenceFlags(N.getFlags()))) { DebugInfoCheckFailed
("invalid reference flags", &N); return; } } while (false
)
;
1280}
1281
1282void Verifier::visitDIFile(const DIFile &N) {
1283 CheckDI(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 (false)
;
1284 std::optional<DIFile::ChecksumInfo<StringRef>> Checksum = N.getChecksum();
1285 if (Checksum) {
1286 CheckDI(Checksum->Kind <= DIFile::ChecksumKind::CSK_Last,do { if (!(Checksum->Kind <= DIFile::ChecksumKind::CSK_Last
)) { DebugInfoCheckFailed("invalid checksum kind", &N); return
; } } while (false)
1287 "invalid checksum kind", &N)do { if (!(Checksum->Kind <= DIFile::ChecksumKind::CSK_Last
)) { DebugInfoCheckFailed("invalid checksum kind", &N); return
; } } while (false)
;
1288 size_t Size;
1289 switch (Checksum->Kind) {
1290 case DIFile::CSK_MD5:
1291 Size = 32;
1292 break;
1293 case DIFile::CSK_SHA1:
1294 Size = 40;
1295 break;
1296 case DIFile::CSK_SHA256:
1297 Size = 64;
1298 break;
1299 }
1300 CheckDI(Checksum->Value.size() == Size, "invalid checksum length", &N)do { if (!(Checksum->Value.size() == Size)) { DebugInfoCheckFailed
("invalid checksum length", &N); return; } } while (false
)
;
1301 CheckDI(Checksum->Value.find_if_not(llvm::isHexDigit) == StringRef::npos,do { if (!(Checksum->Value.find_if_not(llvm::isHexDigit) ==
StringRef::npos)) { DebugInfoCheckFailed("invalid checksum",
&N); return; } } while (false)
1302 "invalid checksum", &N)do { if (!(Checksum->Value.find_if_not(llvm::isHexDigit) ==
StringRef::npos)) { DebugInfoCheckFailed("invalid checksum",
&N); return; } } while (false)
;
1303 }
1304}
1305
1306void Verifier::visitDICompileUnit(const DICompileUnit &N) {
1307 CheckDI(N.isDistinct(), "compile units must be distinct", &N)do { if (!(N.isDistinct())) { DebugInfoCheckFailed("compile units must be distinct"
, &N); return; } } while (false)
;
1308 CheckDI(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 (false)
;
1309
1310 // Don't bother verifying the compilation directory or producer string
1311 // as those could be empty.
1312 CheckDI(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 (false)
1313 N.getRawFile())do { if (!(N.getRawFile() && isa<DIFile>(N.getRawFile
()))) { DebugInfoCheckFailed("invalid file", &N, N.getRawFile
()); return; } } while (false)
;
1314 CheckDI(!N.getFile()->getFilename().empty(), "invalid filename", &N,do { if (!(!N.getFile()->getFilename().empty())) { DebugInfoCheckFailed
("invalid filename", &N, N.getFile()); return; } } while (
false)
1315 N.getFile())do { if (!(!N.getFile()->getFilename().empty())) { DebugInfoCheckFailed
("invalid filename", &N, N.getFile()); return; } } while (
false)
;
1316
1317 CurrentSourceLang = (dwarf::SourceLanguage)N.getSourceLanguage();
1318
1319 verifySourceDebugInfo(N, *N.getFile());
1320
1321 CheckDI((N.getEmissionKind() <= DICompileUnit::LastEmissionKind),do { if (!((N.getEmissionKind() <= DICompileUnit::LastEmissionKind
))) { DebugInfoCheckFailed("invalid emission kind", &N); return
; } } while (false)
1322 "invalid emission kind", &N)do { if (!((N.getEmissionKind() <= DICompileUnit::LastEmissionKind
))) { DebugInfoCheckFailed("invalid emission kind", &N); return
; } } while (false)
;
1323
1324 if (auto *Array = N.getRawEnumTypes()) {
1325 CheckDI(isa<MDTuple>(Array), "invalid enum list", &N, Array)do { if (!(isa<MDTuple>(Array))) { DebugInfoCheckFailed
("invalid enum list", &N, Array); return; } } while (false
)
;
1326 for (Metadata *Op : N.getEnumTypes()->operands()) {
1327 auto *Enum = dyn_cast_or_null<DICompositeType>(Op);
1328 CheckDI(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 (false)
1329 "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 (false)
;
1330 }
1331 }
1332 if (auto *Array = N.getRawRetainedTypes()) {
1333 CheckDI(isa<MDTuple>(Array), "invalid retained type list", &N, Array)do { if (!(isa<MDTuple>(Array))) { DebugInfoCheckFailed
("invalid retained type list", &N, Array); return; } } while
(false)
;
1334 for (Metadata *Op : N.getRetainedTypes()->operands()) {
1335 CheckDI(do { if (!(Op && (isa<DIType>(Op) || (isa<DISubprogram
>(Op) && !cast<DISubprogram>(Op)->isDefinition
())))) { DebugInfoCheckFailed("invalid retained type", &N
, Op); return; } } while (false)
1336 Op && (isa<DIType>(Op) || (isa<DISubprogram>(Op) &&do { if (!(Op && (isa<DIType>(Op) || (isa<DISubprogram
>(Op) && !cast<DISubprogram>(Op)->isDefinition
())))) { DebugInfoCheckFailed("invalid retained type", &N
, Op); return; } } while (false)
1337 !cast<DISubprogram>(Op)->isDefinition())),do { if (!(Op && (isa<DIType>(Op) || (isa<DISubprogram
>(Op) && !cast<DISubprogram>(Op)->isDefinition
())))) { DebugInfoCheckFailed("invalid retained type", &N
, Op); return; } } while (false)
1338 "invalid retained type", &N, Op)do { if (!(Op && (isa<DIType>(Op) || (isa<DISubprogram
>(Op) && !cast<DISubprogram>(Op)->isDefinition
())))) { DebugInfoCheckFailed("invalid retained type", &N
, Op); return; } } while (false)
;
1339 }
1340 }
1341 if (auto *Array = N.getRawGlobalVariables()) {
1342 CheckDI(isa<MDTuple>(Array), "invalid global variable list", &N, Array)do { if (!(isa<MDTuple>(Array))) { DebugInfoCheckFailed
("invalid global variable list", &N, Array); return; } } while
(false)
;
1343 for (Metadata *Op : N.getGlobalVariables()->operands()) {
1344 CheckDI(Op && (isa<DIGlobalVariableExpression>(Op)),do { if (!(Op && (isa<DIGlobalVariableExpression>
(Op)))) { DebugInfoCheckFailed("invalid global variable ref",
&N, Op); return; } } while (false)
1345 "invalid global variable ref", &N, Op)do { if (!(Op && (isa<DIGlobalVariableExpression>
(Op)))) { DebugInfoCheckFailed("invalid global variable ref",
&N, Op); return; } } while (false)
;
1346 }
1347 }
1348 if (auto *Array = N.getRawImportedEntities()) {
1349 CheckDI(isa<MDTuple>(Array), "invalid imported entity list", &N, Array)do { if (!(isa<MDTuple>(Array))) { DebugInfoCheckFailed
("invalid imported entity list", &N, Array); return; } } while
(false)
;
1350 for (Metadata *Op : N.getImportedEntities()->operands()) {
1351 CheckDI(Op && isa<DIImportedEntity>(Op), "invalid imported entity ref",do { if (!(Op && isa<DIImportedEntity>(Op))) { DebugInfoCheckFailed
("invalid imported entity ref", &N, Op); return; } } while
(false)
1352 &N, Op)do { if (!(Op && isa<DIImportedEntity>(Op))) { DebugInfoCheckFailed
("invalid imported entity ref", &N, Op); return; } } while
(false)
;
1353 }
1354 }
1355 if (auto *Array = N.getRawMacros()) {
1356 CheckDI(isa<MDTuple>(Array), "invalid macro list", &N, Array)do { if (!(isa<MDTuple>(Array))) { DebugInfoCheckFailed
("invalid macro list", &N, Array); return; } } while (false
)
;
1357 for (Metadata *Op : N.getMacros()->operands()) {
1358 CheckDI(Op && isa<DIMacroNode>(Op), "invalid macro ref", &N, Op)do { if (!(Op && isa<DIMacroNode>(Op))) { DebugInfoCheckFailed
("invalid macro ref", &N, Op); return; } } while (false)
;
1359 }
1360 }
1361 CUVisited.insert(&N);
1362}
1363
1364void Verifier::visitDISubprogram(const DISubprogram &N) {
1365 CheckDI(N.getTag() == dwarf::DW_TAG_subprogram, "invalid tag", &N)do { if (!(N.getTag() == dwarf::DW_TAG_subprogram)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (false)
;
1366 CheckDI(isScope(N.getRawScope()), "invalid scope", &N, N.getRawScope())do { if (!(isScope(N.getRawScope()))) { DebugInfoCheckFailed(
"invalid scope", &N, N.getRawScope()); return; } } while (
false)
;
1367 if (auto *F = N.getRawFile())
1368 CheckDI(isa<DIFile>(F), "invalid file", &N, F)do { if (!(isa<DIFile>(F))) { DebugInfoCheckFailed("invalid file"
, &N, F); return; } } while (false)
;
1369 else
1370 CheckDI(N.getLine() == 0, "line specified with no file", &N, N.getLine())do { if (!(N.getLine() == 0)) { DebugInfoCheckFailed("line specified with no file"
, &N, N.getLine()); return; } } while (false)
;
1371 if (auto *T = N.getRawType())
1372 CheckDI(isa<DISubroutineType>(T), "invalid subroutine type", &N, T)do { if (!(isa<DISubroutineType>(T))) { DebugInfoCheckFailed
("invalid subroutine type", &N, T); return; } } while (false
)
;
1373 CheckDI(isType(N.getRawContainingType()), "invalid containing type", &N,do { if (!(isType(N.getRawContainingType()))) { DebugInfoCheckFailed
("invalid containing type", &N, N.getRawContainingType())
; return; } } while (false)
1374 N.getRawContainingType())do { if (!(isType(N.getRawContainingType()))) { DebugInfoCheckFailed
("invalid containing type", &N, N.getRawContainingType())
; return; } } while (false)
;
1375 if (auto *Params = N.getRawTemplateParams())
1376 visitTemplateParams(N, *Params);
1377 if (auto *S = N.getRawDeclaration())
1378 CheckDI(isa<DISubprogram>(S) && !cast<DISubprogram>(S)->isDefinition(),do { if (!(isa<DISubprogram>(S) && !cast<DISubprogram
>(S)->isDefinition())) { DebugInfoCheckFailed("invalid subprogram declaration"
, &N, S); return; } } while (false)
1379 "invalid subprogram declaration", &N, S)do { if (!(isa<DISubprogram>(S) && !cast<DISubprogram
>(S)->isDefinition())) { DebugInfoCheckFailed("invalid subprogram declaration"
, &N, S); return; } } while (false)
;
1380 if (auto *RawNode = N.getRawRetainedNodes()) {
1381 auto *Node = dyn_cast<MDTuple>(RawNode);
1382 CheckDI(Node, "invalid retained nodes list", &N, RawNode)do { if (!(Node)) { DebugInfoCheckFailed("invalid retained nodes list"
, &N, RawNode); return; } } while (false)
;
1383 for (Metadata *Op : Node->operands()) {
1384 CheckDI(Op && (isa<DILocalVariable>(Op) || isa<DILabel>(Op)),do { if (!(Op && (isa<DILocalVariable>(Op) || isa
<DILabel>(Op)))) { DebugInfoCheckFailed("invalid retained nodes, expected DILocalVariable or DILabel"
, &N, Node, Op); return; } } while (false)
1385 "invalid retained nodes, expected DILocalVariable or DILabel", &N,do { if (!(Op && (isa<DILocalVariable>(Op) || isa
<DILabel>(Op)))) { DebugInfoCheckFailed("invalid retained nodes, expected DILocalVariable or DILabel"
, &N, Node, Op); return; } } while (false)
1386 Node, Op)do { if (!(Op && (isa<DILocalVariable>(Op) || isa
<DILabel>(Op)))) { DebugInfoCheckFailed("invalid retained nodes, expected DILocalVariable or DILabel"
, &N, Node, Op); return; } } while (false)
;
1387 }
1388 }
1389 CheckDI(!hasConflictingReferenceFlags(N.getFlags()),do { if (!(!hasConflictingReferenceFlags(N.getFlags()))) { DebugInfoCheckFailed
("invalid reference flags", &N); return; } } while (false
)
1390 "invalid reference flags", &N)do { if (!(!hasConflictingReferenceFlags(N.getFlags()))) { DebugInfoCheckFailed
("invalid reference flags", &N); return; } } while (false
)
;
1391
1392 auto *Unit = N.getRawUnit();
1393 if (N.isDefinition()) {
1394 // Subprogram definitions (not part of the type hierarchy).
1395 CheckDI(N.isDistinct(), "subprogram definitions must be distinct", &N)do { if (!(N.isDistinct())) { DebugInfoCheckFailed("subprogram definitions must be distinct"
, &N); return; } } while (false)
;
1396 CheckDI(Unit, "subprogram definitions must have a compile unit", &N)do { if (!(Unit)) { DebugInfoCheckFailed("subprogram definitions must have a compile unit"
, &N); return; } } while (false)
;
1397 CheckDI(isa<DICompileUnit>(Unit), "invalid unit type", &N, Unit)do { if (!(isa<DICompileUnit>(Unit))) { DebugInfoCheckFailed
("invalid unit type", &N, Unit); return; } } while (false
)
;
1398 if (N.getFile())
1399 verifySourceDebugInfo(*N.getUnit(), *N.getFile());
1400 } else {
1401 // Subprogram declarations (part of the type hierarchy).
1402 CheckDI(!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 (false)
;
1403 CheckDI(!N.getRawDeclaration(),do { if (!(!N.getRawDeclaration())) { DebugInfoCheckFailed("subprogram declaration must not have a declaration field"
); return; } } while (false)
1404 "subprogram declaration must not have a declaration field")do { if (!(!N.getRawDeclaration())) { DebugInfoCheckFailed("subprogram declaration must not have a declaration field"
); return; } } while (false)
;
1405 }
1406
1407 if (auto *RawThrownTypes = N.getRawThrownTypes()) {
1408 auto *ThrownTypes = dyn_cast<MDTuple>(RawThrownTypes);
1409 CheckDI(ThrownTypes, "invalid thrown types list", &N, RawThrownTypes)do { if (!(ThrownTypes)) { DebugInfoCheckFailed("invalid thrown types list"
, &N, RawThrownTypes); return; } } while (false)
;
1410 for (Metadata *Op : ThrownTypes->operands())
1411 CheckDI(Op && isa<DIType>(Op), "invalid thrown type", &N, ThrownTypes,do { if (!(Op && isa<DIType>(Op))) { DebugInfoCheckFailed
("invalid thrown type", &N, ThrownTypes, Op); return; } }
while (false)
1412 Op)do { if (!(Op && isa<DIType>(Op))) { DebugInfoCheckFailed
("invalid thrown type", &N, ThrownTypes, Op); return; } }
while (false)
;
1413 }
1414
1415 if (N.areAllCallsDescribed())
1416 CheckDI(N.isDefinition(),do { if (!(N.isDefinition())) { DebugInfoCheckFailed("DIFlagAllCallsDescribed must be attached to a definition"
); return; } } while (false)
1417 "DIFlagAllCallsDescribed must be attached to a definition")do { if (!(N.isDefinition())) { DebugInfoCheckFailed("DIFlagAllCallsDescribed must be attached to a definition"
); return; } } while (false)
;
1418}
1419
1420void Verifier::visitDILexicalBlockBase(const DILexicalBlockBase &N) {
1421 CheckDI(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 (false)
;
1422 CheckDI(N.getRawScope() && isa<DILocalScope>(N.getRawScope()),do { if (!(N.getRawScope() && isa<DILocalScope>
(N.getRawScope()))) { DebugInfoCheckFailed("invalid local scope"
, &N, N.getRawScope()); return; } } while (false)
1423 "invalid local scope", &N, N.getRawScope())do { if (!(N.getRawScope() && isa<DILocalScope>
(N.getRawScope()))) { DebugInfoCheckFailed("invalid local scope"
, &N, N.getRawScope()); return; } } while (false)
;
1424 if (auto *SP = dyn_cast<DISubprogram>(N.getRawScope()))
1425 CheckDI(SP->isDefinition(), "scope points into the type hierarchy", &N)do { if (!(SP->isDefinition())) { DebugInfoCheckFailed("scope points into the type hierarchy"
, &N); return; } } while (false)
;
1426}
1427
1428void Verifier::visitDILexicalBlock(const DILexicalBlock &N) {
1429 visitDILexicalBlockBase(N);
1430
1431 CheckDI(N.getLine() || !N.getColumn(),do { if (!(N.getLine() || !N.getColumn())) { DebugInfoCheckFailed
("cannot have column info without line info", &N); return
; } } while (false)
1432 "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 (false)
;
1433}
1434
1435void Verifier::visitDILexicalBlockFile(const DILexicalBlockFile &N) {
1436 visitDILexicalBlockBase(N);
1437}
1438
1439void Verifier::visitDICommonBlock(const DICommonBlock &N) {
1440 CheckDI(N.getTag() == dwarf::DW_TAG_common_block, "invalid tag", &N)do { if (!(N.getTag() == dwarf::DW_TAG_common_block)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (false)
;
1441 if (auto *S = N.getRawScope())
1442 CheckDI(isa<DIScope>(S), "invalid scope ref", &N, S)do { if (!(isa<DIScope>(S))) { DebugInfoCheckFailed("invalid scope ref"
, &N, S); return; } } while (false)
;
1443 if (auto *S = N.getRawDecl())
1444 CheckDI(isa<DIGlobalVariable>(S), "invalid declaration", &N, S)do { if (!(isa<DIGlobalVariable>(S))) { DebugInfoCheckFailed
("invalid declaration", &N, S); return; } } while (false)
;
1445}
1446
1447void Verifier::visitDINamespace(const DINamespace &N) {
1448 CheckDI(N.getTag() == dwarf::DW_TAG_namespace, "invalid tag", &N)do { if (!(N.getTag() == dwarf::DW_TAG_namespace)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (false)
;
1449 if (auto *S = N.getRawScope())
1450 CheckDI(isa<DIScope>(S), "invalid scope ref", &N, S)do { if (!(isa<DIScope>(S))) { DebugInfoCheckFailed("invalid scope ref"
, &N, S); return; } } while (false)
;
1451}
1452
1453void Verifier::visitDIMacro(const DIMacro &N) {
1454 CheckDI(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 (false)
1455 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 (false)
1456 "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 (false)
;
1457 CheckDI(!N.getName().empty(), "anonymous macro", &N)do { if (!(!N.getName().empty())) { DebugInfoCheckFailed("anonymous macro"
, &N); return; } } while (false)
;
1458 if (!N.getValue().empty()) {
1459 assert(N.getValue().data()[0] != ' ' && "Macro value has a space prefix")(static_cast <bool> (N.getValue().data()[0] != ' ' &&
"Macro value has a space prefix") ? void (0) : __assert_fail
("N.getValue().data()[0] != ' ' && \"Macro value has a space prefix\""
, "llvm/lib/IR/Verifier.cpp", 1459, __extension__ __PRETTY_FUNCTION__
))
;
1460 }
1461}
1462
1463void Verifier::visitDIMacroFile(const DIMacroFile &N) {
1464 CheckDI(N.getMacinfoType() == dwarf::DW_MACINFO_start_file,do { if (!(N.getMacinfoType() == dwarf::DW_MACINFO_start_file
)) { DebugInfoCheckFailed("invalid macinfo type", &N); return
; } } while (false)
1465 "invalid macinfo type", &N)do { if (!(N.getMacinfoType() == dwarf::DW_MACINFO_start_file
)) { DebugInfoCheckFailed("invalid macinfo type", &N); return
; } } while (false)
;
1466 if (auto *F = N.getRawFile())
1467 CheckDI(isa<DIFile>(F), "invalid file", &N, F)do { if (!(isa<DIFile>(F))) { DebugInfoCheckFailed("invalid file"
, &N, F); return; } } while (false)
;
1468
1469 if (auto *Array = N.getRawElements()) {
1470 CheckDI(isa<MDTuple>(Array), "invalid macro list", &N, Array)do { if (!(isa<MDTuple>(Array))) { DebugInfoCheckFailed
("invalid macro list", &N, Array); return; } } while (false
)
;
1471 for (Metadata *Op : N.getElements()->operands()) {
1472 CheckDI(Op && isa<DIMacroNode>(Op), "invalid macro ref", &N, Op)do { if (!(Op && isa<DIMacroNode>(Op))) { DebugInfoCheckFailed
("invalid macro ref", &N, Op); return; } } while (false)
;
1473 }
1474 }
1475}
1476
1477void Verifier::visitDIArgList(const DIArgList &N) {
1478 CheckDI(!N.getNumOperands(),do { if (!(!N.getNumOperands())) { DebugInfoCheckFailed("DIArgList should have no operands other than a list of "
"ValueAsMetadata", &N); return; } } while (false)
1479 "DIArgList should have no operands other than a list of "do { if (!(!N.getNumOperands())) { DebugInfoCheckFailed("DIArgList should have no operands other than a list of "
"ValueAsMetadata", &N); return; } } while (false)
1480 "ValueAsMetadata",do { if (!(!N.getNumOperands())) { DebugInfoCheckFailed("DIArgList should have no operands other than a list of "
"ValueAsMetadata", &N); return; } } while (false)
1481 &N)do { if (!(!N.getNumOperands())) { DebugInfoCheckFailed("DIArgList should have no operands other than a list of "
"ValueAsMetadata", &N); return; } } while (false)
;
1482}
1483
1484void Verifier::visitDIModule(const DIModule &N) {
1485 CheckDI(N.getTag() == dwarf::DW_TAG_module, "invalid tag", &N)do { if (!(N.getTag() == dwarf::DW_TAG_module)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (false)
;
1486 CheckDI(!N.getName().empty(), "anonymous module", &N)do { if (!(!N.getName().empty())) { DebugInfoCheckFailed("anonymous module"
, &N); return; } } while (false)
;
1487}
1488
1489void Verifier::visitDITemplateParameter(const DITemplateParameter &N) {
1490 CheckDI(isType(N.getRawType()), "invalid type ref", &N, N.getRawType())do { if (!(isType(N.getRawType()))) { DebugInfoCheckFailed("invalid type ref"
, &N, N.getRawType()); return; } } while (false)
;
1491}
1492
1493void Verifier::visitDITemplateTypeParameter(const DITemplateTypeParameter &N) {
1494 visitDITemplateParameter(N);
1495
1496 CheckDI(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 (false)
1497 &N)do { if (!(N.getTag() == dwarf::DW_TAG_template_type_parameter
)) { DebugInfoCheckFailed("invalid tag", &N); return; } }
while (false)
;
1498}
1499
1500void Verifier::visitDITemplateValueParameter(
1501 const DITemplateValueParameter &N) {
1502 visitDITemplateParameter(N);
1503
1504 CheckDI(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 (false)
1505 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 (false)
1506 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 (false)
1507 "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 (false)
;
1508}
1509
1510void Verifier::visitDIVariable(const DIVariable &N) {
1511 if (auto *S = N.getRawScope())
1512 CheckDI(isa<DIScope>(S), "invalid scope", &N, S)do { if (!(isa<DIScope>(S))) { DebugInfoCheckFailed("invalid scope"
, &N, S); return; } } while (false)
;
1513 if (auto *F = N.getRawFile())
1514 CheckDI(isa<DIFile>(F), "invalid file", &N, F)do { if (!(isa<DIFile>(F))) { DebugInfoCheckFailed("invalid file"
, &N, F); return; } } while (false)
;
1515}
1516
1517void Verifier::visitDIGlobalVariable(const DIGlobalVariable &N) {
1518 // Checks common to all variables.
1519 visitDIVariable(N);
1520
1521 CheckDI(N.getTag() == dwarf::DW_TAG_variable, "invalid tag", &N)do { if (!(N.getTag() == dwarf::DW_TAG_variable)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (false)
;
1522 CheckDI(isType(N.getRawType()), "invalid type ref", &N, N.getRawType())do { if (!(isType(N.getRawType()))) { DebugInfoCheckFailed("invalid type ref"
, &N, N.getRawType()); return; } } while (false)
;
1523 // Check only if the global variable is not an extern
1524 if (N.isDefinition())
1525 CheckDI(N.getType(), "missing global variable type", &N)do { if (!(N.getType())) { DebugInfoCheckFailed("missing global variable type"
, &N); return; } } while (false)
;
1526 if (auto *Member = N.getRawStaticDataMemberDeclaration()) {
1527 CheckDI(isa<DIDerivedType>(Member),do { if (!(isa<DIDerivedType>(Member))) { DebugInfoCheckFailed
("invalid static data member declaration", &N, Member); return
; } } while (false)
1528 "invalid static data member declaration", &N, Member)do { if (!(isa<DIDerivedType>(Member))) { DebugInfoCheckFailed
("invalid static data member declaration", &N, Member); return
; } } while (false)
;
1529 }
1530}
1531
1532void Verifier::visitDILocalVariable(const DILocalVariable &N) {
1533 // Checks common to all variables.
1534 visitDIVariable(N);
1535
1536 CheckDI(isType(N.getRawType()), "invalid type ref", &N, N.getRawType())do { if (!(isType(N.getRawType()))) { DebugInfoCheckFailed("invalid type ref"
, &N, N.getRawType()); return; } } while (false)
;
1537 CheckDI(N.getTag() == dwarf::DW_TAG_variable, "invalid tag", &N)do { if (!(N.getTag() == dwarf::DW_TAG_variable)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (false)
;
1538 CheckDI(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 (false)
1539 "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 (false)
;
1540 if (auto Ty = N.getType())
1541 CheckDI(!isa<DISubroutineType>(Ty), "invalid type", &N, N.getType())do { if (!(!isa<DISubroutineType>(Ty))) { DebugInfoCheckFailed
("invalid type", &N, N.getType()); return; } } while (false
)
;
1542}
1543
1544void Verifier::visitDIAssignID(const DIAssignID &N) {
1545 CheckDI(!N.getNumOperands(), "DIAssignID has no arguments", &N)do { if (!(!N.getNumOperands())) { DebugInfoCheckFailed("DIAssignID has no arguments"
, &N); return; } } while (false)
;
1546 CheckDI(N.isDistinct(), "DIAssignID must be distinct", &N)do { if (!(N.isDistinct())) { DebugInfoCheckFailed("DIAssignID must be distinct"
, &N); return; } } while (false)
;
1547}
1548
1549void Verifier::visitDILabel(const DILabel &N) {
1550 if (auto *S = N.getRawScope())
1551 CheckDI(isa<DIScope>(S), "invalid scope", &N, S)do { if (!(isa<DIScope>(S))) { DebugInfoCheckFailed("invalid scope"
, &N, S); return; } } while (false)
;
1552 if (auto *F = N.getRawFile())
1553 CheckDI(isa<DIFile>(F), "invalid file", &N, F)do { if (!(isa<DIFile>(F))) { DebugInfoCheckFailed("invalid file"
, &N, F); return; } } while (false)
;
1554
1555 CheckDI(N.getTag() == dwarf::DW_TAG_label, "invalid tag", &N)do { if (!(N.getTag() == dwarf::DW_TAG_label)) { DebugInfoCheckFailed
("invalid tag", &N); return; } } while (false)
;
1556 CheckDI(N.getRawScope() && isa<DILocalScope>(N.getRawScope()),do { if (!(N.getRawScope() && isa<DILocalScope>
(N.getRawScope()))) { DebugInfoCheckFailed("label requires a valid scope"
, &N, N.getRawScope()); return; } } while (false)
1557 "label requires a valid scope", &N, N.getRawScope())do { if (!(N.getRawScope() && isa<DILocalScope>
(N.getRawScope()))) { DebugInfoCheckFailed("label requires a valid scope"
, &N, N.getRawScope()); return; } } while (false)
;
1558}
1559
1560void Verifier::visitDIExpression(const DIExpression &N) {
1561 CheckDI(N.isValid(), "invalid expression", &N)do { if (!(N.isValid())) { DebugInfoCheckFailed("invalid expression"
, &N); return; } } while (false)
;
1562}
1563
1564void Verifier::visitDIGlobalVariableExpression(
1565 const DIGlobalVariableExpression &GVE) {
1566 CheckDI(GVE.getVariable(), "missing variable")do { if (!(GVE.getVariable())) { DebugInfoCheckFailed("missing variable"
); return; } } while (false)
;
1567 if (auto *Var = GVE.getVariable())
1568 visitDIGlobalVariable(*Var);
1569 if (auto *Expr = GVE.getExpression()) {
1570 visitDIExpression(*Expr);
1571 if (auto Fragment = Expr->getFragmentInfo())
1572 verifyFragmentExpression(*GVE.getVariable(), *Fragment, &GVE);
1573 }
1574}
1575
1576void Verifier::visitDIObjCProperty(const DIObjCProperty &N) {
1577 CheckDI(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 (false)
;
1578 if (auto *T = N.getRawType())
1579 CheckDI(isType(T), "invalid type ref", &N, T)do { if (!(isType(T))) { DebugInfoCheckFailed("invalid type ref"
, &N, T); return; } } while (false)
;
1580 if (auto *F = N.getRawFile())
1581 CheckDI(isa<DIFile>(F), "invalid file", &N, F)do { if (!(isa<DIFile>(F))) { DebugInfoCheckFailed("invalid file"
, &N, F); return; } } while (false)
;
1582}
1583
1584void Verifier::visitDIImportedEntity(const DIImportedEntity &N) {
1585 CheckDI(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 (false)
1586 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 (false)
1587 "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 (false)
;
1588 if (auto *S = N.getRawScope())
1589 CheckDI(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 (false)
;
1590 CheckDI(isDINode(N.getRawEntity()), "invalid imported entity", &N,do { if (!(isDINode(N.getRawEntity()))) { DebugInfoCheckFailed
("invalid imported entity", &N, N.getRawEntity()); return
; } } while (false)
1591 N.getRawEntity())do { if (!(isDINode(N.getRawEntity()))) { DebugInfoCheckFailed
("invalid imported entity", &N, N.getRawEntity()); return
; } } while (false)
;
1592}
1593
1594void Verifier::visitComdat(const Comdat &C) {
1595 // In COFF the Module is invalid if the GlobalValue has private linkage.
1596 // Entities with private linkage don't have entries in the symbol table.
1597 if (TT.isOSBinFormatCOFF())
1598 if (const GlobalValue *GV = M.getNamedValue(C.getName()))
1599 Check(!GV->hasPrivateLinkage(), "comdat global value has private linkage",do { if (!(!GV->hasPrivateLinkage())) { CheckFailed("comdat global value has private linkage"
, GV); return; } } while (false)
1600 GV)do { if (!(!GV->hasPrivateLinkage())) { CheckFailed("comdat global value has private linkage"
, GV); return; } } while (false)
;
1601}
1602
1603void Verifier::visitModuleIdents() {
1604 const NamedMDNode *Idents = M.getNamedMetadata("llvm.ident");
1605 if (!Idents)
1606 return;
1607
1608 // llvm.ident takes a list of metadata entry. Each entry has only one string.
1609 // Scan each llvm.ident entry and make sure that this requirement is met.
1610 for (const MDNode *N : Idents->operands()) {
1611 Check(N->getNumOperands() == 1,do { if (!(N->getNumOperands() == 1)) { CheckFailed("incorrect number of operands in llvm.ident metadata"
, N); return; } } while (false)
1612 "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 (false)
;
1613 Check(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 (false)
1614 ("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 (false)
1615 "(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 (false)
1616 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 (false)
;
1617 }
1618}
1619
1620void Verifier::visitModuleCommandLines() {
1621 const NamedMDNode *CommandLines = M.getNamedMetadata("llvm.commandline");
1622 if (!CommandLines)
1623 return;
1624
1625 // llvm.commandline takes a list of metadata entry. Each entry has only one
1626 // string. Scan each llvm.commandline entry and make sure that this
1627 // requirement is met.
1628 for (const MDNode *N : CommandLines->operands()) {
1629 Check(N->getNumOperands() == 1,do { if (!(N->getNumOperands() == 1)) { CheckFailed("incorrect number of operands in llvm.commandline metadata"
, N); return; } } while (false)
1630 "incorrect number of operands in llvm.commandline metadata", N)do { if (!(N->getNumOperands() == 1)) { CheckFailed("incorrect number of operands in llvm.commandline metadata"
, N); return; } } while (false)
;
1631 Check(dyn_cast_or_null<MDString>(N->getOperand(0)),do { if (!(dyn_cast_or_null<MDString>(N->getOperand(
0)))) { CheckFailed(("invalid value for llvm.commandline metadata entry operand"
"(the operand should be a string)"), N->getOperand(0)); return
; } } while (false)
1632 ("invalid value for llvm.commandline metadata entry operand"do { if (!(dyn_cast_or_null<MDString>(N->getOperand(
0)))) { CheckFailed(("invalid value for llvm.commandline metadata entry operand"
"(the operand should be a string)"), N->getOperand(0)); return
; } } while (false)
1633 "(the operand should be a string)"),do { if (!(dyn_cast_or_null<MDString>(N->getOperand(
0)))) { CheckFailed(("invalid value for llvm.commandline metadata entry operand"
"(the operand should be a string)"), N->getOperand(0)); return
; } } while (false)
1634 N->getOperand(0))do { if (!(dyn_cast_or_null<MDString>(N->getOperand(
0)))) { CheckFailed(("invalid value for llvm.commandline metadata entry operand"
"(the operand should be a string)"), N->getOperand(0)); return
; } } while (false)
;
1635 }
1636}
1637
1638void Verifier::visitModuleFlags() {
1639 const NamedMDNode *Flags = M.getModuleFlagsMetadata();
1640 if (!Flags) return;
1641
1642 // Scan each flag, and track the flags and requirements.
1643 DenseMap<const MDString*, const MDNode*> SeenIDs;
1644 SmallVector<const MDNode*, 16> Requirements;
1645 for (const MDNode *MDN : Flags->operands())
1646 visitModuleFlag(MDN, SeenIDs, Requirements);
1647
1648 // Validate that the requirements in the module are valid.
1649 for (const MDNode *Requirement : Requirements) {
1650 const MDString *Flag = cast<MDString>(Requirement->getOperand(0));
1651 const Metadata *ReqValue = Requirement->getOperand(1);
1652
1653 const MDNode *Op = SeenIDs.lookup(Flag);
1654 if (!Op) {
1655 CheckFailed("invalid requirement on flag, flag is not present in module",
1656 Flag);
1657 continue;
1658 }
1659
1660 if (Op->getOperand(2) != ReqValue) {
1661 CheckFailed(("invalid requirement on flag, "
1662 "flag does not have the required value"),
1663 Flag);
1664 continue;
1665 }
1666 }
1667}
1668
1669void
1670Verifier::visitModuleFlag(const MDNode *Op,
1671 DenseMap<const MDString *, const MDNode *> &SeenIDs,
1672 SmallVectorImpl<const MDNode *> &Requirements) {
1673 // Each module flag should have three arguments, the merge behavior (a
1674 // constant int), the flag ID (an MDString), and the value.
1675 Check(Op->getNumOperands() == 3,do { if (!(Op->getNumOperands() == 3)) { CheckFailed("incorrect number of operands in module flag"
, Op); return; } } while (false)
1676 "incorrect number of operands in module flag", Op)do { if (!(Op->getNumOperands() == 3)) { CheckFailed("incorrect number of operands in module flag"
, Op); return; } } while (false)
;
1677 Module::ModFlagBehavior MFB;
1678 if (!Module::isValidModFlagBehavior(Op->getOperand(0), MFB)) {
1679 Check(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 (false)
1680 "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 (false)
1681 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 (false)
;
1682 Check(false,do { if (!(false)) { CheckFailed("invalid behavior operand in module flag (unexpected constant)"
, Op->getOperand(0)); return; } } while (false)
1683 "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 (false)
1684 Op->getOperand(0))do { if (!(false)) { CheckFailed("invalid behavior operand in module flag (unexpected constant)"
, Op->getOperand(0)); return; } } while (false)
;
1685 }
1686 MDString *ID = dyn_cast_or_null<MDString>(Op->getOperand(1));
1687 Check(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 (false)
1688 Op->getOperand(1))do { if (!(ID)) { CheckFailed("invalid ID operand in module flag (expected metadata string)"
, Op->getOperand(1)); return; } } while (false)
;
1689
1690 // Check the values for behaviors with additional requirements.
1691 switch (MFB) {
1692 case Module::Error:
1693 case Module::Warning:
1694 case Module::Override:
1695 // These behavior types accept any value.
1696 break;
1697
1698 case Module::Min: {
1699 auto *V = mdconst::dyn_extract_or_null<ConstantInt>(Op->getOperand(2));
1700 Check(V && V->getValue().isNonNegative(),do { if (!(V && V->getValue().isNonNegative())) { CheckFailed
("invalid value for 'min' module flag (expected constant non-negative "
"integer)", Op->getOperand(2)); return; } } while (false)
1701 "invalid value for 'min' module flag (expected constant non-negative "do { if (!(V && V->getValue().isNonNegative())) { CheckFailed
("invalid value for 'min' module flag (expected constant non-negative "
"integer)", Op->getOperand(2)); return; } } while (false)
1702 "integer)",do { if (!(V && V->getValue().isNonNegative())) { CheckFailed
("invalid value for 'min' module flag (expected constant non-negative "
"integer)", Op->getOperand(2)); return; } } while (false)
1703 Op->getOperand(2))do { if (!(V && V->getValue().isNonNegative())) { CheckFailed
("invalid value for 'min' module flag (expected constant non-negative "
"integer)", Op->getOperand(2)); return; } } while (false)
;
1704 break;
1705 }
1706
1707 case Module::Max: {
1708 Check(mdconst::dyn_extract_or_null<ConstantInt>(Op->getOperand(2)),do { if (!(mdconst::dyn_extract_or_null<ConstantInt>(Op
->getOperand(2)))) { CheckFailed("invalid value for 'max' module flag (expected constant integer)"
, Op->getOperand(2)); return; } } while (false)
1709 "invalid value for 'max' module flag (expected constant integer)",do { if (!(mdconst::dyn_extract_or_null<ConstantInt>(Op
->getOperand(2)))) { CheckFailed("invalid value for 'max' module flag (expected constant integer)"
, Op->getOperand(2)); return; } } while (false)
1710 Op->getOperand(2))do { if (!(mdconst::dyn_extract_or_null<ConstantInt>(Op
->getOperand(2)))) { CheckFailed("invalid value for 'max' module flag (expected constant integer)"
, Op->getOperand(2)); return; } } while (false)
;
1711 break;
1712 }
1713
1714 case Module::Require: {
1715 // The value should itself be an MDNode with two operands, a flag ID (an
1716 // MDString), and a value.
1717 MDNode *Value = dyn_cast<MDNode>(Op->getOperand(2));
1718 Check(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 (false)
1719 "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 (false)
1720 Op->getOperand(2))do { if (!(Value && Value->getNumOperands() == 2))
{ CheckFailed("invalid value for 'require' module flag (expected metadata pair)"
, Op->getOperand(2)); return; } } while (false)
;
1721 Check(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 (false)
1722 ("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 (false)
1723 "(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 (false)
1724 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 (false)
;
1725
1726 // Append it to the list of requirements, to check once all module flags are
1727 // scanned.
1728 Requirements.push_back(Value);
1729 break;
1730 }
1731
1732 case Module::Append:
1733 case Module::AppendUnique: {
1734 // These behavior types require the operand be an MDNode.
1735 Check(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 (false)
1736 "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 (false)
1737 "(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 (false)
1738 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 (false)
;
1739 break;
1740 }
1741 }
1742
1743 // Unless this is a "requires" flag, check the ID is unique.
1744 if (MFB != Module::Require) {
1745 bool Inserted = SeenIDs.insert(std::make_pair(ID, Op)).second;
1746 Check(Inserted,do { if (!(Inserted)) { CheckFailed("module flag identifiers must be unique (or of 'require' type)"
, ID); return; } } while (false)
1747 "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 (false)
;
1748 }
1749
1750 if (ID->getString() == "wchar_size") {
1751 ConstantInt *Value
1752 = mdconst::dyn_extract_or_null<ConstantInt>(Op->getOperand(2));
1753 Check(Value, "wchar_size metadata requires constant integer argument")do { if (!(Value)) { CheckFailed("wchar_size metadata requires constant integer argument"
); return; } } while (false)
;
1754 }
1755
1756 if (ID->getString() == "Linker Options") {
1757 // If the llvm.linker.options named metadata exists, we assume that the
1758 // bitcode reader has upgraded the module flag. Otherwise the flag might
1759 // have been created by a client directly.
1760 Check(M.getNamedMetadata("llvm.linker.options"),do { if (!(M.getNamedMetadata("llvm.linker.options"))) { CheckFailed
("'Linker Options' named metadata no longer supported"); return
; } } while (false)
1761 "'Linker Options' named metadata no longer supported")do { if (!(M.getNamedMetadata("llvm.linker.options"))) { CheckFailed
("'Linker Options' named metadata no longer supported"); return
; } } while (false)
;
1762 }
1763
1764 if (ID->getString() == "SemanticInterposition") {
1765 ConstantInt *Value =
1766 mdconst::dyn_extract_or_null<ConstantInt>(Op->getOperand(2));
1767 Check(Value,do { if (!(Value)) { CheckFailed("SemanticInterposition metadata requires constant integer argument"
); return; } } while (false)
1768 "SemanticInterposition metadata requires constant integer argument")do { if (!(Value)) { CheckFailed("SemanticInterposition metadata requires constant integer argument"
); return; } } while (false)
;
1769 }
1770
1771 if (ID->getString() == "CG Profile") {
1772 for (const MDOperand &MDO : cast<MDNode>(Op->getOperand(2))->operands())
1773 visitModuleFlagCGProfileEntry(MDO);
1774 }
1775}
1776
1777void Verifier::visitModuleFlagCGProfileEntry(const MDOperand &MDO) {
1778 auto CheckFunction = [&](const MDOperand &FuncMDO) {
1779 if (!FuncMDO)
1780 return;
1781 auto F = dyn_cast<ValueAsMetadata>(FuncMDO);
1782 Check(F && isa<Function>(F->getValue()->stripPointerCasts()),do { if (!(F && isa<Function>(F->getValue()->
stripPointerCasts()))) { CheckFailed("expected a Function or null"
, FuncMDO); return; } } while (false)
1783 "expected a Function or null", FuncMDO)do { if (!(F && isa<Function>(F->getValue()->
stripPointerCasts()))) { CheckFailed("expected a Function or null"
, FuncMDO); return; } } while (false)
;
1784 };
1785 auto Node = dyn_cast_or_null<MDNode>(MDO);
1786 Check(Node && Node->getNumOperands() == 3, "expected a MDNode triple", MDO)do { if (!(Node && Node->getNumOperands() == 3)) {
CheckFailed("expected a MDNode triple", MDO); return; } } while
(false)
;
1787 CheckFunction(Node->getOperand(0));
1788 CheckFunction(Node->getOperand(1));
1789 auto Count = dyn_cast_or_null<ConstantAsMetadata>(Node->getOperand(2));
1790 Check(Count && Count->getType()->isIntegerTy(),do { if (!(Count && Count->getType()->isIntegerTy
())) { CheckFailed("expected an integer constant", Node->getOperand
(2)); return; } } while (false)
1791 "expected an integer constant", Node->getOperand(2))do { if (!(Count && Count->getType()->isIntegerTy
())) { CheckFailed("expected an integer constant", Node->getOperand
(2)); return; } } while (false)
;
1792}
1793
1794void Verifier::verifyAttributeTypes(AttributeSet Attrs, const Value *V) {
1795 for (Attribute A : Attrs) {
1796
1797 if (A.isStringAttribute()) {
1798#define GET_ATTR_NAMES
1799#define ATTRIBUTE_ENUM(ENUM_NAME, DISPLAY_NAME)
1800#define ATTRIBUTE_STRBOOL(ENUM_NAME, DISPLAY_NAME) \
1801 if (A.getKindAsString() == #DISPLAY_NAME) { \
1802 auto V = A.getValueAsString(); \
1803 if (!(V.empty() || V == "true" || V == "false")) \
1804 CheckFailed("invalid value for '" #DISPLAY_NAME "' attribute: " + V + \
1805 ""); \
1806 }
1807
1808#include "llvm/IR/Attributes.inc"
1809 continue;
1810 }
1811
1812 if (A.isIntAttribute() != Attribute::isIntAttrKind(A.getKindAsEnum())) {
1813 CheckFailed("Attribute '" + A.getAsString() + "' should have an Argument",
1814 V);
1815 return;
1816 }
1817 }
1818}
1819
1820// VerifyParameterAttrs - Check the given attributes for an argument or return
1821// value of the specified type. The value V is printed in error messages.
1822void Verifier::verifyParameterAttrs(AttributeSet Attrs, Type *Ty,
1823 const Value *V) {
1824 if (!Attrs.hasAttributes())
1825 return;
1826
1827 verifyAttributeTypes(Attrs, V);
1828
1829 for (Attribute Attr : Attrs)
1830 Check(Attr.isStringAttribute() ||do { if (!(Attr.isStringAttribute() || Attribute::canUseAsParamAttr
(Attr.getKindAsEnum()))) { CheckFailed("Attribute '" + Attr.getAsString
() + "' does not apply to parameters", V); return; } } while (
false)
1831 Attribute::canUseAsParamAttr(Attr.getKindAsEnum()),do { if (!(Attr.isStringAttribute() || Attribute::canUseAsParamAttr
(Attr.getKindAsEnum()))) { CheckFailed("Attribute '" + Attr.getAsString
() + "' does not apply to parameters", V); return; } } while (
false)
1832 "Attribute '" + Attr.getAsString() + "' does not apply to parameters",do { if (!(Attr.isStringAttribute() || Attribute::canUseAsParamAttr
(Attr.getKindAsEnum()))) { CheckFailed("Attribute '" + Attr.getAsString
() + "' does not apply to parameters", V); return; } } while (
false)
1833 V)do { if (!(Attr.isStringAttribute() || Attribute::canUseAsParamAttr
(Attr.getKindAsEnum()))) { CheckFailed("Attribute '" + Attr.getAsString
() + "' does not apply to parameters", V); return; } } while (
false)
;
1834
1835 if (Attrs.hasAttribute(Attribute::ImmArg)) {
1836 Check(Attrs.getNumAttributes() == 1,do { if (!(Attrs.getNumAttributes() == 1)) { CheckFailed("Attribute 'immarg' is incompatible with other attributes"
, V); return; } } while (false)
1837 "Attribute 'immarg' is incompatible with other attributes", V)do { if (!(Attrs.getNumAttributes() == 1)) { CheckFailed("Attribute 'immarg' is incompatible with other attributes"
, V); return; } } while (false)
;
1838 }
1839
1840 // Check for mutually incompatible attributes. Only inreg is compatible with
1841 // sret.
1842 unsigned AttrCount = 0;
1843 AttrCount += Attrs.hasAttribute(Attribute::ByVal);
1844 AttrCount += Attrs.hasAttribute(Attribute::InAlloca);
1845 AttrCount += Attrs.hasAttribute(Attribute::Preallocated);
1846 AttrCount += Attrs.hasAttribute(Attribute::StructRet) ||
1847 Attrs.hasAttribute(Attribute::InReg);
1848 AttrCount += Attrs.hasAttribute(Attribute::Nest);
1849 AttrCount += Attrs.hasAttribute(Attribute::ByRef);
1850 Check(AttrCount <= 1,do { if (!(AttrCount <= 1)) { CheckFailed("Attributes 'byval', 'inalloca', 'preallocated', 'inreg', 'nest', "
"'byref', and 'sret' are incompatible!", V); return; } } while
(false)
1851 "Attributes 'byval', 'inalloca', 'preallocated', 'inreg', 'nest', "do { if (!(AttrCount <= 1)) { CheckFailed("Attributes 'byval', 'inalloca', 'preallocated', 'inreg', 'nest', "
"'byref', and 'sret' are incompatible!", V); return; } } while
(false)
1852 "'byref', and 'sret' are incompatible!",do { if (!(AttrCount <= 1)) { CheckFailed("Attributes 'byval', 'inalloca', 'preallocated', 'inreg', 'nest', "
"'byref', and 'sret' are incompatible!", V); return; } } while
(false)
1853 V)do { if (!(AttrCount <= 1)) { CheckFailed("Attributes 'byval', 'inalloca', 'preallocated', 'inreg', 'nest', "
"'byref', and 'sret' are incompatible!", V); return; } } while
(false)
;
1854
1855 Check(!(Attrs.hasAttribute(Attribute::InAlloca) &&do { if (!(!(Attrs.hasAttribute(Attribute::InAlloca) &&
Attrs.hasAttribute(Attribute::ReadOnly)))) { CheckFailed("Attributes "
"'inalloca and readonly' are incompatible!", V); return; } }
while (false)
1856 Attrs.hasAttribute(Attribute::ReadOnly)),do { if (!(!(Attrs.hasAttribute(Attribute::InAlloca) &&
Attrs.hasAttribute(Attribute::ReadOnly)))) { CheckFailed("Attributes "
"'inalloca and readonly' are incompatible!", V); return; } }
while (false)
1857 "Attributes "do { if (!(!(Attrs.hasAttribute(Attribute::InAlloca) &&
Attrs.hasAttribute(Attribute::ReadOnly)))) { CheckFailed("Attributes "
"'inalloca and readonly' are incompatible!", V); return; } }
while (false)
1858 "'inalloca and readonly' are incompatible!",do { if (!(!(Attrs.hasAttribute(Attribute::InAlloca) &&
Attrs.hasAttribute(Attribute::ReadOnly)))) { CheckFailed("Attributes "
"'inalloca and readonly' are incompatible!", V); return; } }
while (false)
1859 V)do { if (!(!(Attrs.hasAttribute(Attribute::InAlloca) &&
Attrs.hasAttribute(Attribute::ReadOnly)))) { CheckFailed("Attributes "
"'inalloca and readonly' are incompatible!", V); return; } }
while (false)
;
1860
1861 Check(!(Attrs.hasAttribute(Attribute::StructRet) &&do { if (!(!(Attrs.hasAttribute(Attribute::StructRet) &&
Attrs.hasAttribute(Attribute::Returned)))) { CheckFailed("Attributes "
"'sret and returned' are incompatible!", V); return; } } while
(false)
1862 Attrs.hasAttribute(Attribute::Returned)),do { if (!(!(Attrs.hasAttribute(Attribute::StructRet) &&
Attrs.hasAttribute(Attribute::Returned)))) { CheckFailed("Attributes "
"'sret and returned' are incompatible!", V); return; } } while
(false)
1863 "Attributes "do { if (!(!(Attrs.hasAttribute(Attribute::StructRet) &&
Attrs.hasAttribute(Attribute::Returned)))) { CheckFailed("Attributes "
"'sret and returned' are incompatible!", V); return; } } while
(false)
1864 "'sret and returned' are incompatible!",do { if (!(!(Attrs.hasAttribute(Attribute::StructRet) &&
Attrs.hasAttribute(Attribute::Returned)))) { CheckFailed("Attributes "
"'sret and returned' are incompatible!", V); return; } } while
(false)
1865 V)do { if (!(!(Attrs.hasAttribute(Attribute::StructRet) &&
Attrs.hasAttribute(Attribute::Returned)))) { CheckFailed("Attributes "
"'sret and returned' are incompatible!", V); return; } } while
(false)
;
1866
1867 Check(!(Attrs.hasAttribute(Attribute::ZExt) &&do { if (!(!(Attrs.hasAttribute(Attribute::ZExt) && Attrs
.hasAttribute(Attribute::SExt)))) { CheckFailed("Attributes "
"'zeroext and signext' are incompatible!", V); return; } } while
(false)
1868 Attrs.hasAttribute(Attribute::SExt)),do { if (!(!(Attrs.hasAttribute(Attribute::ZExt) && Attrs
.hasAttribute(Attribute::SExt)))) { CheckFailed("Attributes "
"'zeroext and signext' are incompatible!", V); return; } } while
(false)
1869 "Attributes "do { if (!(!(Attrs.hasAttribute(Attribute::ZExt) && Attrs
.hasAttribute(Attribute::SExt)))) { CheckFailed("Attributes "
"'zeroext and signext' are incompatible!", V); return; } } while
(false)
1870 "'zeroext and signext' are incompatible!",do { if (!(!(Attrs.hasAttribute(Attribute::ZExt) && Attrs
.hasAttribute(Attribute::SExt)))) { CheckFailed("Attributes "
"'zeroext and signext' are incompatible!", V); return; } } while
(false)
1871 V)do { if (!(!(Attrs.hasAttribute(Attribute::ZExt) && Attrs
.hasAttribute(Attribute::SExt)))) { CheckFailed("Attributes "
"'zeroext and signext' are incompatible!", V); return; } } while
(false)
;
1872
1873 Check(!(Attrs.hasAttribute(Attribute::ReadNone) &&do { if (!(!(Attrs.hasAttribute(Attribute::ReadNone) &&
Attrs.hasAttribute(Attribute::ReadOnly)))) { CheckFailed("Attributes "
"'readnone and readonly' are incompatible!", V); return; } }
while (false)
1874 Attrs.hasAttribute(Attribute::ReadOnly)),do { if (!(!(Attrs.hasAttribute(Attribute::ReadNone) &&
Attrs.hasAttribute(Attribute::ReadOnly)))) { CheckFailed("Attributes "
"'readnone and readonly' are incompatible!", V); return; } }
while (false)
1875 "Attributes "do { if (!(!(Attrs.hasAttribute(Attribute::ReadNone) &&
Attrs.hasAttribute(Attribute::ReadOnly)))) { CheckFailed("Attributes "
"'readnone and readonly' are incompatible!", V); return; } }
while (false)
1876 "'readnone and readonly' are incompatible!",do { if (!(!(Attrs.hasAttribute(Attribute::ReadNone) &&
Attrs.hasAttribute(Attribute::ReadOnly)))) { CheckFailed("Attributes "
"'readnone and readonly' are incompatible!", V); return; } }
while (false)
1877 V)do { if (!(!(Attrs.hasAttribute(Attribute::ReadNone) &&
Attrs.hasAttribute(Attribute::ReadOnly)))) { CheckFailed("Attributes "
"'readnone and readonly' are incompatible!", V); return; } }
while (false)
;
1878
1879 Check(!(Attrs.hasAttribute(Attribute::ReadNone) &&do { if (!(!(Attrs.hasAttribute(Attribute::ReadNone) &&
Attrs.hasAttribute(Attribute::WriteOnly)))) { CheckFailed("Attributes "
"'readnone and writeonly' are incompatible!", V); return; } }
while (false)
1880 Attrs.hasAttribute(Attribute::WriteOnly)),do { if (!(!(Attrs.hasAttribute(Attribute::ReadNone) &&
Attrs.hasAttribute(Attribute::WriteOnly)))) { CheckFailed("Attributes "
"'readnone and writeonly' are incompatible!", V); return; } }
while (false)
1881 "Attributes "do { if (!(!(Attrs.hasAttribute(Attribute::ReadNone) &&
Attrs.hasAttribute(Attribute::WriteOnly)))) { CheckFailed("Attributes "
"'readnone and writeonly' are incompatible!", V); return; } }
while (false)
1882 "'readnone and writeonly' are incompatible!",do { if (!(!(Attrs.hasAttribute(Attribute::ReadNone) &&
Attrs.hasAttribute(Attribute::WriteOnly)))) { CheckFailed("Attributes "
"'readnone and writeonly' are incompatible!", V); return; } }
while (false)
1883 V)do { if (!(!(Attrs.hasAttribute(Attribute::ReadNone) &&
Attrs.hasAttribute(Attribute::WriteOnly)))) { CheckFailed("Attributes "
"'readnone and writeonly' are incompatible!", V); return; } }
while (false)
;
1884
1885 Check(!(Attrs.hasAttribute(Attribute::ReadOnly) &&do { if (!(!(Attrs.hasAttribute(Attribute::ReadOnly) &&
Attrs.hasAttribute(Attribute::WriteOnly)))) { CheckFailed("Attributes "
"'readonly and writeonly' are incompatible!", V); return; } }
while (false)
1886 Attrs.hasAttribute(Attribute::WriteOnly)),do { if (!(!(Attrs.hasAttribute(Attribute::ReadOnly) &&
Attrs.hasAttribute(Attribute::WriteOnly)))) { CheckFailed("Attributes "
"'readonly and writeonly' are incompatible!", V); return; } }
while (false)
1887 "Attributes "do { if (!(!(Attrs.hasAttribute(Attribute::ReadOnly) &&
Attrs.hasAttribute(Attribute::WriteOnly)))) { CheckFailed("Attributes "
"'readonly and writeonly' are incompatible!", V); return; } }
while (false)
1888 "'readonly and writeonly' are incompatible!",do { if (!(!(Attrs.hasAttribute(Attribute::ReadOnly) &&
Attrs.hasAttribute(Attribute::WriteOnly)))) { CheckFailed("Attributes "
"'readonly and writeonly' are incompatible!", V); return; } }
while (false)
1889 V)do { if (!(!(Attrs.hasAttribute(Attribute::ReadOnly) &&
Attrs.hasAttribute(Attribute::WriteOnly)))) { CheckFailed("Attributes "
"'readonly and writeonly' are incompatible!", V); return; } }
while (false)
;
1890
1891 Check(!(Attrs.hasAttribute(Attribute::NoInline) &&do { if (!(!(Attrs.hasAttribute(Attribute::NoInline) &&
Attrs.hasAttribute(Attribute::AlwaysInline)))) { CheckFailed
("Attributes " "'noinline and alwaysinline' are incompatible!"
, V); return; } } while (false)
1892 Attrs.hasAttribute(Attribute::AlwaysInline)),do { if (!(!(Attrs.hasAttribute(Attribute::NoInline) &&
Attrs.hasAttribute(Attribute::AlwaysInline)))) { CheckFailed
("Attributes " "'noinline and alwaysinline' are incompatible!"
, V); return; } } while (false)
1893 "Attributes "do { if (!(!(Attrs.hasAttribute(Attribute::NoInline) &&
Attrs.hasAttribute(Attribute::AlwaysInline)))) { CheckFailed
("Attributes " "'noinline and alwaysinline' are incompatible!"
, V); return; } } while (false)
1894 "'noinline and alwaysinline' are incompatible!",do { if (!(!(Attrs.hasAttribute(Attribute::NoInline) &&
Attrs.hasAttribute(Attribute::AlwaysInline)))) { CheckFailed
("Attributes " "'noinline and alwaysinline' are incompatible!"
, V); return; } } while (false)
1895 V)do { if (!(!(Attrs.hasAttribute(Attribute::NoInline) &&
Attrs.hasAttribute(Attribute::AlwaysInline)))) { CheckFailed
("Attributes " "'noinline and alwaysinline' are incompatible!"
, V); return; } } while (false)
;
1896
1897 AttributeMask IncompatibleAttrs = AttributeFuncs::typeIncompatible(Ty);
1898 for (Attribute Attr : Attrs) {
1899 if (!Attr.isStringAttribute() &&
1900 IncompatibleAttrs.contains(Attr.getKindAsEnum())) {
1901 CheckFailed("Attribute '" + Attr.getAsString() +
1902 "' applied to incompatible type!", V);
1903 return;
1904 }
1905 }
1906
1907 if (PointerType *PTy = dyn_cast<PointerType>(Ty)) {
1908 if (Attrs.hasAttribute(Attribute::ByVal)) {
1909 if (Attrs.hasAttribute(Attribute::Alignment)) {
1910 Align AttrAlign = Attrs.getAlignment().valueOrOne();
1911 Align MaxAlign(ParamMaxAlignment);
1912 Check(AttrAlign <= MaxAlign,do { if (!(AttrAlign <= MaxAlign)) { CheckFailed("Attribute 'align' exceed the max size 2^14"
, V); return; } } while (false)
1913 "Attribute 'align' exceed the max size 2^14", V)do { if (!(AttrAlign <= MaxAlign)) { CheckFailed("Attribute 'align' exceed the max size 2^14"
, V); return; } } while (false)
;
1914 }
1915 SmallPtrSet<Type *, 4> Visited;
1916 Check(Attrs.getByValType()->isSized(&Visited),do { if (!(Attrs.getByValType()->isSized(&Visited))) {
CheckFailed("Attribute 'byval' does not support unsized types!"
, V); return; } } while (false)
1917 "Attribute 'byval' does not support unsized types!", V)do { if (!(Attrs.getByValType()->isSized(&Visited))) {
CheckFailed("Attribute 'byval' does not support unsized types!"
, V); return; } } while (false)
;
1918 }
1919 if (Attrs.hasAttribute(Attribute::ByRef)) {
1920 SmallPtrSet<Type *, 4> Visited;
1921 Check(Attrs.getByRefType()->isSized(&Visited),do { if (!(Attrs.getByRefType()->isSized(&Visited))) {
CheckFailed("Attribute 'byref' does not support unsized types!"
, V); return; } } while (false)
1922 "Attribute 'byref' does not support unsized types!", V)do { if (!(Attrs.getByRefType()->isSized(&Visited))) {
CheckFailed("Attribute 'byref' does not support unsized types!"
, V); return; } } while (false)
;
1923 }
1924 if (Attrs.hasAttribute(Attribute::InAlloca)) {
1925 SmallPtrSet<Type *, 4> Visited;
1926 Check(Attrs.getInAllocaType()->isSized(&Visited),do { if (!(Attrs.getInAllocaType()->isSized(&Visited))
) { CheckFailed("Attribute 'inalloca' does not support unsized types!"
, V); return; } } while (false)
1927 "Attribute 'inalloca' does not support unsized types!", V)do { if (!(Attrs.getInAllocaType()->isSized(&Visited))
) { CheckFailed("Attribute 'inalloca' does not support unsized types!"
, V); return; } } while (false)
;
1928 }
1929 if (Attrs.hasAttribute(Attribute::Preallocated)) {
1930 SmallPtrSet<Type *, 4> Visited;
1931 Check(Attrs.getPreallocatedType()->isSized(&Visited),do { if (!(Attrs.getPreallocatedType()->isSized(&Visited
))) { CheckFailed("Attribute 'preallocated' does not support unsized types!"
, V); return; } } while (false)
1932 "Attribute 'preallocated' does not support unsized types!", V)do { if (!(Attrs.getPreallocatedType()->isSized(&Visited
))) { CheckFailed("Attribute 'preallocated' does not support unsized types!"
, V); return; } } while (false)
;
1933 }
1934 if (!PTy->isOpaque()) {
1935 if (!isa<PointerType>(PTy->getNonOpaquePointerElementType()))
1936 Check(!Attrs.hasAttribute(Attribute::SwiftError),do { if (!(!Attrs.hasAttribute(Attribute::SwiftError))) { CheckFailed
("Attribute 'swifterror' only applies to parameters " "with pointer to pointer type!"
, V); return; } } while (false)
1937 "Attribute 'swifterror' only applies to parameters "do { if (!(!Attrs.hasAttribute(Attribute::SwiftError))) { CheckFailed
("Attribute 'swifterror' only applies to parameters " "with pointer to pointer type!"
, V); return; } } while (false)
1938 "with pointer to pointer type!",do { if (!(!Attrs.hasAttribute(Attribute::SwiftError))) { CheckFailed
("Attribute 'swifterror' only applies to parameters " "with pointer to pointer type!"
, V); return; } } while (false)
1939 V)do { if (!(!Attrs.hasAttribute(Attribute::SwiftError))) { CheckFailed
("Attribute 'swifterror' only applies to parameters " "with pointer to pointer type!"
, V); return; } } while (false)
;
1940 if (Attrs.hasAttribute(Attribute::ByRef)) {
1941 Check(Attrs.getByRefType() == PTy->getNonOpaquePointerElementType(),do { if (!(Attrs.getByRefType() == PTy->getNonOpaquePointerElementType
())) { CheckFailed("Attribute 'byref' type does not match parameter!"
, V); return; } } while (false)
1942 "Attribute 'byref' type does not match parameter!", V)do { if (!(Attrs.getByRefType() == PTy->getNonOpaquePointerElementType
())) { CheckFailed("Attribute 'byref' type does not match parameter!"
, V); return; } } while (false)
;
1943 }
1944
1945 if (Attrs.hasAttribute(Attribute::ByVal) && Attrs.getByValType()) {
1946 Check(Attrs.getByValType() == PTy->getNonOpaquePointerElementType(),do { if (!(Attrs.getByValType() == PTy->getNonOpaquePointerElementType
())) { CheckFailed("Attribute 'byval' type does not match parameter!"
, V); return; } } while (false)
1947 "Attribute 'byval' type does not match parameter!", V)do { if (!(Attrs.getByValType() == PTy->getNonOpaquePointerElementType
())) { CheckFailed("Attribute 'byval' type does not match parameter!"
, V); return; } } while (false)
;
1948 }
1949
1950 if (Attrs.hasAttribute(Attribute::Preallocated)) {
1951 Check(Attrs.getPreallocatedType() ==do { if (!(Attrs.getPreallocatedType() == PTy->getNonOpaquePointerElementType
())) { CheckFailed("Attribute 'preallocated' type does not match parameter!"
, V); return; } } while (false)
1952 PTy->getNonOpaquePointerElementType(),do { if (!(Attrs.getPreallocatedType() == PTy->getNonOpaquePointerElementType
())) { CheckFailed("Attribute 'preallocated' type does not match parameter!"
, V); return; } } while (false)
1953 "Attribute 'preallocated' type does not match parameter!", V)do { if (!(Attrs.getPreallocatedType() == PTy->getNonOpaquePointerElementType
())) { CheckFailed("Attribute 'preallocated' type does not match parameter!"
, V); return; } } while (false)
;
1954 }
1955
1956 if (Attrs.hasAttribute(Attribute::InAlloca)) {
1957 Check(Attrs.getInAllocaType() == PTy->getNonOpaquePointerElementType(),do { if (!(Attrs.getInAllocaType() == PTy->getNonOpaquePointerElementType
())) { CheckFailed("Attribute 'inalloca' type does not match parameter!"
, V); return; } } while (false)
1958 "Attribute 'inalloca' type does not match parameter!", V)do { if (!(Attrs.getInAllocaType() == PTy->getNonOpaquePointerElementType
())) { CheckFailed("Attribute 'inalloca' type does not match parameter!"
, V); return; } } while (false)
;
1959 }
1960
1961 if (Attrs.hasAttribute(Attribute::ElementType)) {
1962 Check(Attrs.getElementType() == PTy->getNonOpaquePointerElementType(),do { if (!(Attrs.getElementType() == PTy->getNonOpaquePointerElementType
())) { CheckFailed("Attribute 'elementtype' type does not match parameter!"
, V); return; } } while (false)
1963 "Attribute 'elementtype' type does not match parameter!", V)do { if (!(Attrs.getElementType() == PTy->getNonOpaquePointerElementType
())) { CheckFailed("Attribute 'elementtype' type does not match parameter!"
, V); return; } } while (false)
;
1964 }
1965 }
1966 }
1967
1968 if (Attrs.hasAttribute(Attribute::NoFPClass)) {
1969 uint64_t Val = Attrs.getAttribute(Attribute::NoFPClass).getValueAsInt();
1970 Check(Val != 0, "Attribute 'nofpclass' must have at least one test bit set",do { if (!(Val != 0)) { CheckFailed("Attribute 'nofpclass' must have at least one test bit set"
, V); return; } } while (false)
1971 V)do { if (!(Val != 0)) { CheckFailed("Attribute 'nofpclass' must have at least one test bit set"
, V); return; } } while (false)
;
1972 Check((Val & ~static_cast<unsigned>(fcAllFlags)) == 0,do { if (!((Val & ~static_cast<unsigned>(fcAllFlags
)) == 0)) { CheckFailed("Invalid value for 'nofpclass' test mask"
, V); return; } } while (false)
1973 "Invalid value for 'nofpclass' test mask", V)do { if (!((Val & ~static_cast<unsigned>(fcAllFlags
)) == 0)) { CheckFailed("Invalid value for 'nofpclass' test mask"
, V); return; } } while (false)
;
1974 }
1975}
1976
1977void Verifier::checkUnsignedBaseTenFuncAttr(AttributeList Attrs, StringRef Attr,
1978 const Value *V) {
1979 if (Attrs.hasFnAttr(Attr)) {
1980 StringRef S = Attrs.getFnAttr(Attr).getValueAsString();
1981 unsigned N;
1982 if (S.getAsInteger(10, N))
1983 CheckFailed("\"" + Attr + "\" takes an unsigned integer: " + S, V);
1984 }
1985}
1986
1987// Check parameter attributes against a function type.
1988// The value V is printed in error messages.
1989void Verifier::verifyFunctionAttrs(FunctionType *FT, AttributeList Attrs,
1990 const Value *V, bool IsIntrinsic,
1991 bool IsInlineAsm) {
1992 if (Attrs.isEmpty())
1993 return;
1994
1995 if (AttributeListsVisited.insert(Attrs.getRawPointer()).second) {
1996 Check(Attrs.hasParentContext(Context),do { if (!(Attrs.hasParentContext(Context))) { CheckFailed("Attribute list does not match Module context!"
, &Attrs, V); return; } } while (false)
1997 "Attribute list does not match Module context!", &Attrs, V)do { if (!(Attrs.hasParentContext(Context))) { CheckFailed("Attribute list does not match Module context!"
, &Attrs, V); return; } } while (false)
;
1998 for (const auto &AttrSet : Attrs) {
1999 Check(!AttrSet.hasAttributes() || AttrSet.hasParentContext(Context),do { if (!(!AttrSet.hasAttributes() || AttrSet.hasParentContext
(Context))) { CheckFailed("Attribute set does not match Module context!"
, &AttrSet, V); return; } } while (false)
2000 "Attribute set does not match Module context!", &AttrSet, V)do { if (!(!AttrSet.hasAttributes() || AttrSet.hasParentContext
(Context))) { CheckFailed("Attribute set does not match Module context!"
, &AttrSet, V); return; } } while (false)
;
2001 for (const auto &A : AttrSet) {
2002 Check(A.hasParentContext(Context),do { if (!(A.hasParentContext(Context))) { CheckFailed("Attribute does not match Module context!"
, &A, V); return; } } while (false)
2003 "Attribute does not match Module context!", &A, V)do { if (!(A.hasParentContext(Context))) { CheckFailed("Attribute does not match Module context!"
, &A, V); return; } } while (false)
;
2004 }
2005 }
2006 }
2007
2008 bool SawNest = false;
2009 bool SawReturned = false;
2010 bool SawSRet = false;
2011 bool SawSwiftSelf = false;
2012 bool SawSwiftAsync = false;
2013 bool SawSwiftError = false;
2014
2015 // Verify return value attributes.
2016 AttributeSet RetAttrs = Attrs.getRetAttrs();
2017 for (Attribute RetAttr : RetAttrs)
2018 Check(RetAttr.isStringAttribute() ||do { if (!(RetAttr.isStringAttribute() || Attribute::canUseAsRetAttr
(RetAttr.getKindAsEnum()))) { CheckFailed("Attribute '" + RetAttr
.getAsString() + "' does not apply to function return values"
, V); return; } } while (false)
2019 Attribute::canUseAsRetAttr(RetAttr.getKindAsEnum()),do { if (!(RetAttr.isStringAttribute() || Attribute::canUseAsRetAttr
(RetAttr.getKindAsEnum()))) { CheckFailed("Attribute '" + RetAttr
.getAsString() + "' does not apply to function return values"
, V); return; } } while (false)
2020 "Attribute '" + RetAttr.getAsString() +do { if (!(RetAttr.isStringAttribute() || Attribute::canUseAsRetAttr
(RetAttr.getKindAsEnum()))) { CheckFailed("Attribute '" + RetAttr
.getAsString() + "' does not apply to function return values"
, V); return; } } while (false)
2021 "' does not apply to function return values",do { if (!(RetAttr.isStringAttribute() || Attribute::canUseAsRetAttr
(RetAttr.getKindAsEnum()))) { CheckFailed("Attribute '" + RetAttr
.getAsString() + "' does not apply to function return values"
, V); return; } } while (false)
2022 V)do { if (!(RetAttr.isStringAttribute() || Attribute::canUseAsRetAttr
(RetAttr.getKindAsEnum()))) { CheckFailed("Attribute '" + RetAttr
.getAsString() + "' does not apply to function return values"
, V); return; } } while (false)
;
2023
2024 verifyParameterAttrs(RetAttrs, FT->getReturnType(), V);
2025
2026 // Verify parameter attributes.
2027 for (unsigned i = 0, e = FT->getNumParams(); i != e; ++i) {
2028 Type *Ty = FT->getParamType(i);
2029 AttributeSet ArgAttrs = Attrs.getParamAttrs(i);
2030
2031 if (!IsIntrinsic) {
2032 Check(!ArgAttrs.hasAttribute(Attribute::ImmArg),do { if (!(!ArgAttrs.hasAttribute(Attribute::ImmArg))) { CheckFailed
("immarg attribute only applies to intrinsics", V); return; }
} while (false)
2033 "immarg attribute only applies to intrinsics", V)do { if (!(!ArgAttrs.hasAttribute(Attribute::ImmArg))) { CheckFailed
("immarg attribute only applies to intrinsics", V); return; }
} while (false)
;
2034 if (!IsInlineAsm)
2035 Check(!ArgAttrs.hasAttribute(Attribute::ElementType),do { if (!(!ArgAttrs.hasAttribute(Attribute::ElementType))) {
CheckFailed("Attribute 'elementtype' can only be applied to intrinsics"
" and inline asm.", V); return; } } while (false)
2036 "Attribute 'elementtype' can only be applied to intrinsics"do { if (!(!ArgAttrs.hasAttribute(Attribute::ElementType))) {
CheckFailed("Attribute 'elementtype' can only be applied to intrinsics"
" and inline asm.", V); return; } } while (false)
2037 " and inline asm.",do { if (!(!ArgAttrs.hasAttribute(Attribute::ElementType))) {
CheckFailed("Attribute 'elementtype' can only be applied to intrinsics"
" and inline asm.", V); return; } } while (false)
2038 V)do { if (!(!ArgAttrs.hasAttribute(Attribute::ElementType))) {
CheckFailed("Attribute 'elementtype' can only be applied to intrinsics"
" and inline asm.", V); return; } } while (false)
;
2039 }
2040
2041 verifyParameterAttrs(ArgAttrs, Ty, V);
2042
2043 if (ArgAttrs.hasAttribute(Attribute::Nest)) {
2044 Check(!SawNest, "More than one parameter has attribute nest!", V)do { if (!(!SawNest)) { CheckFailed("More than one parameter has attribute nest!"
, V); return; } } while (false)
;
2045 SawNest = true;
2046 }
2047
2048 if (ArgAttrs.hasAttribute(Attribute::Returned)) {
2049 Check(!SawReturned, "More than one parameter has attribute returned!", V)do { if (!(!SawReturned)) { CheckFailed("More than one parameter has attribute returned!"
, V); return; } } while (false)
;
2050 Check(Ty->canLosslesslyBitCastTo(FT->getReturnType()),do { if (!(Ty->canLosslesslyBitCastTo(FT->getReturnType
()))) { CheckFailed("Incompatible argument and return types for 'returned' attribute"
, V); return; } } while (false)
2051 "Incompatible 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 (false)
2052 V)do { if (!(Ty->canLosslesslyBitCastTo(FT->getReturnType
()))) { CheckFailed("Incompatible argument and return types for 'returned' attribute"
, V); return; } } while (false)
;
2053 SawReturned = true;
2054 }
2055
2056 if (ArgAttrs.hasAttribute(Attribute::StructRet)) {
2057 Check(!SawSRet, "Cannot have multiple 'sret' parameters!", V)do { if (!(!SawSRet)) { CheckFailed("Cannot have multiple 'sret' parameters!"
, V); return; } } while (false)
;
2058 Check(i == 0 || i == 1,do { if (!(i == 0 || i == 1)) { CheckFailed("Attribute 'sret' is not on first or second parameter!"
, V); return; } } while (false)
2059 "Attribute 'sret' is not on first or second parameter!", V)do { if (!(i == 0 || i == 1)) { CheckFailed("Attribute 'sret' is not on first or second parameter!"
, V); return; } } while (false)
;
2060 SawSRet = true;
2061 }
2062
2063 if (ArgAttrs.hasAttribute(Attribute::SwiftSelf)) {
2064 Check(!SawSwiftSelf, "Cannot have multiple 'swiftself' parameters!", V)do { if (!(!SawSwiftSelf)) { CheckFailed("Cannot have multiple 'swiftself' parameters!"
, V); return; } } while (false)
;
2065 SawSwiftSelf = true;
2066 }
2067
2068 if (ArgAttrs.hasAttribute(Attribute::SwiftAsync)) {
2069 Check(!SawSwiftAsync, "Cannot have multiple 'swiftasync' parameters!", V)do { if (!(!SawSwiftAsync)) { CheckFailed("Cannot have multiple 'swiftasync' parameters!"
, V); return; } } while (false)
;
2070 SawSwiftAsync = true;
2071 }
2072
2073 if (ArgAttrs.hasAttribute(Attribute::SwiftError)) {
2074 Check(!SawSwiftError, "Cannot have multiple 'swifterror' parameters!", V)do { if (!(!SawSwiftError)) { CheckFailed("Cannot have multiple 'swifterror' parameters!"
, V); return; } } while (false)
;
2075 SawSwiftError = true;
2076 }
2077
2078 if (ArgAttrs.hasAttribute(Attribute::InAlloca)) {
2079 Check(i == FT->getNumParams() - 1,do { if (!(i == FT->getNumParams() - 1)) { CheckFailed("inalloca isn't on the last parameter!"
, V); return; } } while (false)
2080 "inalloca isn't on the last parameter!", V)do { if (!(i == FT->getNumParams() - 1)) { CheckFailed("inalloca isn't on the last parameter!"
, V); return; } } while (false)
;
2081 }
2082 }
2083
2084 if (!Attrs.hasFnAttrs())
2085 return;
2086
2087 verifyAttributeTypes(Attrs.getFnAttrs(), V);
2088 for (Attribute FnAttr : Attrs.getFnAttrs())
2089 Check(FnAttr.isStringAttribute() ||do { if (!(FnAttr.isStringAttribute() || Attribute::canUseAsFnAttr
(FnAttr.getKindAsEnum()))) { CheckFailed("Attribute '" + FnAttr
.getAsString() + "' does not apply to functions!", V); return
; } } while (false)
2090 Attribute::canUseAsFnAttr(FnAttr.getKindAsEnum()),do { if (!(FnAttr.isStringAttribute() || Attribute::canUseAsFnAttr
(FnAttr.getKindAsEnum()))) { CheckFailed("Attribute '" + FnAttr
.getAsString() + "' does not apply to functions!", V); return
; } } while (false)
2091 "Attribute '" + FnAttr.getAsString() +do { if (!(FnAttr.isStringAttribute() || Attribute::canUseAsFnAttr
(FnAttr.getKindAsEnum()))) { CheckFailed("Attribute '" + FnAttr
.getAsString() + "' does not apply to functions!", V); return
; } } while (false)
2092 "' does not apply to functions!",do { if (!(FnAttr.isStringAttribute() || Attribute::canUseAsFnAttr
(FnAttr.getKindAsEnum()))) { CheckFailed("Attribute '" + FnAttr
.getAsString() + "' does not apply to functions!", V); return
; } } while (false)
2093 V)do { if (!(FnAttr.isStringAttribute() || Attribute::canUseAsFnAttr
(FnAttr.getKindAsEnum()))) { CheckFailed("Attribute '" + FnAttr
.getAsString() + "' does not apply to functions!", V); return
; } } while (false)
;
2094
2095 Check(!(Attrs.hasFnAttr(Attribute::NoInline) &&do { if (!(!(Attrs.hasFnAttr(Attribute::NoInline) && Attrs
.hasFnAttr(Attribute::AlwaysInline)))) { CheckFailed("Attributes 'noinline and alwaysinline' are incompatible!"
, V); return; } } while (false)
2096 Attrs.hasFnAttr(Attribute::AlwaysInline)),do { if (!(!(Attrs.hasFnAttr(Attribute::NoInline) && Attrs
.hasFnAttr(Attribute::AlwaysInline)))) { CheckFailed("Attributes 'noinline and alwaysinline' are incompatible!"
, V); return; } } while (false)
2097 "Attributes 'noinline and alwaysinline' are incompatible!", V)do { if (!(!(Attrs.hasFnAttr(Attribute::NoInline) && Attrs
.hasFnAttr(Attribute::AlwaysInline)))) { CheckFailed("Attributes 'noinline and alwaysinline' are incompatible!"
, V); return; } } while (false)
;
2098
2099 if (Attrs.hasFnAttr(Attribute::OptimizeNone)) {
2100 Check(Attrs.hasFnAttr(Attribute::NoInline),do { if (!(Attrs.hasFnAttr(Attribute::NoInline))) { CheckFailed
("Attribute 'optnone' requires 'noinline'!", V); return; } } while
(false)
2101 "Attribute 'optnone' requires 'noinline'!", V)do { if (!(Attrs.hasFnAttr(Attribute::NoInline))) { CheckFailed
("Attribute 'optnone' requires 'noinline'!", V); return; } } while
(false)
;
2102
2103 Check(!Attrs.hasFnAttr(Attribute::OptimizeForSize),do { if (!(!Attrs.hasFnAttr(Attribute::OptimizeForSize))) { CheckFailed
("Attributes 'optsize and optnone' are incompatible!", V); return
; } } while (false)
2104 "Attributes 'optsize and optnone' are incompatible!", V)do { if (!(!Attrs.hasFnAttr(Attribute::OptimizeForSize))) { CheckFailed
("Attributes 'optsize and optnone' are incompatible!", V); return
; } } while (false)
;
2105
2106 Check(!Attrs.hasFnAttr(Attribute::MinSize),do { if (!(!Attrs.hasFnAttr(Attribute::MinSize))) { CheckFailed
("Attributes 'minsize and optnone' are incompatible!", V); return
; } } while (false)
2107 "Attributes 'minsize and optnone' are incompatible!", V)do { if (!(!Attrs.hasFnAttr(Attribute::MinSize))) { CheckFailed
("Attributes 'minsize and optnone' are incompatible!", V); return
; } } while (false)
;
2108 }
2109
2110 if (Attrs.hasFnAttr("aarch64_pstate_sm_enabled")) {
2111 Check(!Attrs.hasFnAttr("aarch64_pstate_sm_compatible"),do { if (!(!Attrs.hasFnAttr("aarch64_pstate_sm_compatible")))
{ CheckFailed("Attributes 'aarch64_pstate_sm_enabled and " "aarch64_pstate_sm_compatible' are incompatible!"
, V); return; } } while (false)
2112 "Attributes 'aarch64_pstate_sm_enabled and "do { if (!(!Attrs.hasFnAttr("aarch64_pstate_sm_compatible")))
{ CheckFailed("Attributes 'aarch64_pstate_sm_enabled and " "aarch64_pstate_sm_compatible' are incompatible!"
, V); return; } } while (false)
2113 "aarch64_pstate_sm_compatible' are incompatible!",do { if (!(!Attrs.hasFnAttr("aarch64_pstate_sm_compatible")))
{ CheckFailed("Attributes 'aarch64_pstate_sm_enabled and " "aarch64_pstate_sm_compatible' are incompatible!"
, V); return; } } while (false)
2114 V)do { if (!(!Attrs.hasFnAttr("aarch64_pstate_sm_compatible")))
{ CheckFailed("Attributes 'aarch64_pstate_sm_enabled and " "aarch64_pstate_sm_compatible' are incompatible!"
, V); return; } } while (false)
;
2115 }
2116
2117 if (Attrs.hasFnAttr("aarch64_pstate_za_new")) {
2118 Check(!Attrs.hasFnAttr("aarch64_pstate_za_preserved"),do { if (!(!Attrs.hasFnAttr("aarch64_pstate_za_preserved"))) {
CheckFailed("Attributes 'aarch64_pstate_za_new and aarch64_pstate_za_preserved' "
"are incompatible!", V); return; } } while (false)
2119 "Attributes 'aarch64_pstate_za_new and aarch64_pstate_za_preserved' "do { if (!(!Attrs.hasFnAttr("aarch64_pstate_za_preserved"))) {
CheckFailed("Attributes 'aarch64_pstate_za_new and aarch64_pstate_za_preserved' "
"are incompatible!", V); return; } } while (false)
2120 "are incompatible!",do { if (!(!Attrs.hasFnAttr("aarch64_pstate_za_preserved"))) {
CheckFailed("Attributes 'aarch64_pstate_za_new and aarch64_pstate_za_preserved' "
"are incompatible!", V); return; } } while (false)
2121 V)do { if (!(!Attrs.hasFnAttr("aarch64_pstate_za_preserved"))) {
CheckFailed("Attributes 'aarch64_pstate_za_new and aarch64_pstate_za_preserved' "
"are incompatible!", V); return; } } while (false)
;
2122
2123 Check(!Attrs.hasFnAttr("aarch64_pstate_za_shared"),do { if (!(!Attrs.hasFnAttr("aarch64_pstate_za_shared"))) { CheckFailed
("Attributes 'aarch64_pstate_za_new and aarch64_pstate_za_shared' "
"are incompatible!", V); return; } } while (false)
2124 "Attributes 'aarch64_pstate_za_new and aarch64_pstate_za_shared' "do { if (!(!Attrs.hasFnAttr("aarch64_pstate_za_shared"))) { CheckFailed
("Attributes 'aarch64_pstate_za_new and aarch64_pstate_za_shared' "
"are incompatible!", V); return; } } while (false)
2125 "are incompatible!",do { if (!(!Attrs.hasFnAttr("aarch64_pstate_za_shared"))) { CheckFailed
("Attributes 'aarch64_pstate_za_new and aarch64_pstate_za_shared' "
"are incompatible!", V); return; } } while (false)
2126 V)do { if (!(!Attrs.hasFnAttr("aarch64_pstate_za_shared"))) { CheckFailed
("Attributes 'aarch64_pstate_za_new and aarch64_pstate_za_shared' "
"are incompatible!", V); return; } } while (false)
;
2127 }
2128
2129 if (Attrs.hasFnAttr(Attribute::JumpTable)) {
2130 const GlobalValue *GV = cast<GlobalValue>(V);
2131 Check(GV->hasGlobalUnnamedAddr(),do { if (!(GV->hasGlobalUnnamedAddr())) { CheckFailed("Attribute 'jumptable' requires 'unnamed_addr'"
, V); return; } } while (false)
2132 "Attribute 'jumptable' requires 'unnamed_addr'", V)do { if (!(GV->hasGlobalUnnamedAddr())) { CheckFailed("Attribute 'jumptable' requires 'unnamed_addr'"
, V); return; } } while (false)
;
2133 }
2134
2135 if (auto Args = Attrs.getFnAttrs().getAllocSizeArgs()) {
2136 auto CheckParam = [&](StringRef Name, unsigned ParamNo) {
2137 if (ParamNo >= FT->getNumParams()) {
2138 CheckFailed("'allocsize' " + Name + " argument is out of bounds", V);
2139 return false;
2140 }
2141
2142 if (!FT->getParamType(ParamNo)->isIntegerTy()) {
2143 CheckFailed("'allocsize' " + Name +
2144 " argument must refer to an integer parameter",
2145 V);
2146 return false;
2147 }
2148
2149 return true;
2150 };
2151
2152 if (!CheckParam("element size", Args->first))
2153 return;
2154
2155 if (Args->second && !CheckParam("number of elements", *Args->second))
2156 return;
2157 }
2158
2159 if (Attrs.hasFnAttr(Attribute::AllocKind)) {
2160 AllocFnKind K = Attrs.getAllocKind();
2161 AllocFnKind Type =
2162 K & (AllocFnKind::Alloc | AllocFnKind::Realloc | AllocFnKind::Free);
2163 if (!is_contained(
2164 {AllocFnKind::Alloc, AllocFnKind::Realloc, AllocFnKind::Free},
2165 Type))
2166 CheckFailed(
2167 "'allockind()' requires exactly one of alloc, realloc, and free");
2168 if ((Type == AllocFnKind::Free) &&
2169 ((K & (AllocFnKind::Uninitialized | AllocFnKind::Zeroed |
2170 AllocFnKind::Aligned)) != AllocFnKind::Unknown))
2171 CheckFailed("'allockind(\"free\")' doesn't allow uninitialized, zeroed, "
2172 "or aligned modifiers.");
2173 AllocFnKind ZeroedUninit = AllocFnKind::Uninitialized | AllocFnKind::Zeroed;
2174 if ((K & ZeroedUninit) == ZeroedUninit)
2175 CheckFailed("'allockind()' can't be both zeroed and uninitialized");
2176 }
2177
2178 if (Attrs.hasFnAttr(Attribute::VScaleRange)) {
2179 unsigned VScaleMin = Attrs.getFnAttrs().getVScaleRangeMin();
2180 if (VScaleMin == 0)
2181 CheckFailed("'vscale_range' minimum must be greater than 0", V);
2182
2183 std::optional<unsigned> VScaleMax = Attrs.getFnAttrs().getVScaleRangeMax();
2184 if (VScaleMax && VScaleMin > VScaleMax)
2185 CheckFailed("'vscale_range' minimum cannot be greater than maximum", V);
2186 }
2187
2188 if (Attrs.hasFnAttr("frame-pointer")) {
2189 StringRef FP = Attrs.getFnAttr("frame-pointer").getValueAsString();
2190 if (FP != "all" && FP != "non-leaf" && FP != "none")
2191 CheckFailed("invalid value for 'frame-pointer' attribute: " + FP, V);
2192 }
2193
2194 checkUnsignedBaseTenFuncAttr(Attrs, "patchable-function-prefix", V);
2195 checkUnsignedBaseTenFuncAttr(Attrs, "patchable-function-entry", V);
2196 checkUnsignedBaseTenFuncAttr(Attrs, "warn-stack-size", V);
2197}
2198
2199void Verifier::verifyFunctionMetadata(
2200 ArrayRef<std::pair<unsigned, MDNode *>> MDs) {
2201 for (const auto &Pair : MDs) {
2202 if (Pair.first == LLVMContext::MD_prof) {
2203 MDNode *MD = Pair.second;
2204 Check(MD->getNumOperands() >= 2,do { if (!(MD->getNumOperands() >= 2)) { CheckFailed("!prof annotations should have no less than 2 operands"
, MD); return; } } while (false)
2205 "!prof annotations should have no less than 2 operands", MD)do { if (!(MD->getNumOperands() >= 2)) { CheckFailed("!prof annotations should have no less than 2 operands"
, MD); return; } } while (false)
;
2206
2207 // Check first operand.
2208 Check(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 (false)
2209 MD)do { if (!(MD->getOperand(0) != nullptr)) { CheckFailed("first operand should not be null"
, MD); return; } } while (false)
;
2210 Check(isa<MDString>(MD->getOperand(0)),do { if (!(isa<MDString>(MD->getOperand(0)))) { CheckFailed
("expected string with name of the !prof annotation", MD); return
; } } while (false)
2211 "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 (false)
;
2212 MDString *MDS = cast<MDString>(MD->getOperand(0));
2213 StringRef ProfName = MDS->getString();
2214 Check(ProfName.equals("function_entry_count") ||do { if (!(ProfName.equals("function_entry_count") || ProfName
.equals("synthetic_function_entry_count"))) { CheckFailed("first operand should be 'function_entry_count'"
" or 'synthetic_function_entry_count'", MD); return; } } while
(false)
2215 ProfName.equals("synthetic_function_entry_count"),do { if (!(ProfName.equals("function_entry_count") || ProfName
.equals("synthetic_function_entry_count"))) { CheckFailed("first operand should be 'function_entry_count'"
" or 'synthetic_function_entry_count'", MD); return; } } while
(false)
2216 "first operand should be 'function_entry_count'"do { if (!(ProfName.equals("function_entry_count") || ProfName
.equals("synthetic_function_entry_count"))) { CheckFailed("first operand should be 'function_entry_count'"
" or 'synthetic_function_entry_count'", MD); return; } } while
(false)
2217 " or 'synthetic_function_entry_count'",do { if (!(ProfName.equals("function_entry_count") || ProfName
.equals("synthetic_function_entry_count"))) { CheckFailed("first operand should be 'function_entry_count'"
" or 'synthetic_function_entry_count'", MD); return; } } while
(false)
2218 MD)do { if (!(ProfName.equals("function_entry_count") || ProfName
.equals("synthetic_function_entry_count"))) { CheckFailed("first operand should be 'function_entry_count'"
" or 'synthetic_function_entry_count'", MD); return; } } while
(false)
;
2219
2220 // Check second operand.
2221 Check(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 (false)
2222 MD)do { if (!(MD->getOperand(1) != nullptr)) { CheckFailed("second operand should not be null"
, MD); return; } } while (false)
;
2223 Check(isa<ConstantAsMetadata>(MD->getOperand(1)),do { if (!(isa<ConstantAsMetadata>(MD->getOperand(1)
))) { CheckFailed("expected integer argument to function_entry_count"
, MD); return; } } while (false)
2224 "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 (false)
;
2225 } else if (Pair.first == LLVMContext::MD_kcfi_type) {
2226 MDNode *MD = Pair.second;
2227 Check(MD->getNumOperands() == 1,do { if (!(MD->getNumOperands() == 1)) { CheckFailed("!kcfi_type must have exactly one operand"
, MD); return; } } while (false)
2228 "!kcfi_type must have exactly one operand", MD)do { if (!(MD->getNumOperands() == 1)) { CheckFailed("!kcfi_type must have exactly one operand"
, MD); return; } } while (false)
;
2229 Check(MD->getOperand(0) != nullptr, "!kcfi_type operand must not be null",do { if (!(MD->getOperand(0) != nullptr)) { CheckFailed("!kcfi_type operand must not be null"
, MD); return; } } while (false)
2230 MD)do { if (!(MD->getOperand(0) != nullptr)) { CheckFailed("!kcfi_type operand must not be null"
, MD); return; } } while (false)
;
2231 Check(isa<ConstantAsMetadata>(MD->getOperand(0)),do { if (!(isa<ConstantAsMetadata>(MD->getOperand(0)
))) { CheckFailed("expected a constant operand for !kcfi_type"
, MD); return; } } while (false)
2232 "expected a constant operand for !kcfi_type", MD)do { if (!(isa<ConstantAsMetadata>(MD->getOperand(0)
))) { CheckFailed("expected a constant operand for !kcfi_type"
, MD); return; } } while (false)
;
2233 Constant *C = cast<ConstantAsMetadata>(MD->getOperand(0))->getValue();
2234 Check(isa<ConstantInt>(C),do { if (!(isa<ConstantInt>(C))) { CheckFailed("expected a constant integer operand for !kcfi_type"
, MD); return; } } while (false)
2235 "expected a constant integer operand for !kcfi_type", MD)do { if (!(isa<ConstantInt>(C))) { CheckFailed("expected a constant integer operand for !kcfi_type"
, MD); return; } } while (false)
;
2236 IntegerType *Type = cast<ConstantInt>(C)->getType();
2237 Check(Type->getBitWidth() == 32,do { if (!(Type->getBitWidth() == 32)) { CheckFailed("expected a 32-bit integer constant operand for !kcfi_type"
, MD); return; } } while (false)
2238 "expected a 32-bit integer constant operand for !kcfi_type", MD)do { if (!(Type->getBitWidth() == 32)) { CheckFailed("expected a 32-bit integer constant operand for !kcfi_type"
, MD); return; } } while (false)
;
2239 }
2240 }
2241}
2242
2243void Verifier::visitConstantExprsRecursively(const Constant *EntryC) {
2244 if (!ConstantExprVisited.insert(EntryC).second)
2245 return;
2246
2247 SmallVector<const Constant *, 16> Stack;
2248 Stack.push_back(EntryC);
2249
2250 while (!Stack.empty()) {
2251 const Constant *C = Stack.pop_back_val();
2252
2253 // Check this constant expression.
2254 if (const auto *CE = dyn_cast<ConstantExpr>(C))
2255 visitConstantExpr(CE);
2256
2257 if (const auto *GV = dyn_cast<GlobalValue>(C)) {
2258 // Global Values get visited separately, but we do need to make sure
2259 // that the global value is in the correct module
2260 Check(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 (
false)
2261 EntryC, &M, GV, GV->getParent())do { if (!(GV->getParent() == &M)) { CheckFailed("Referencing global in another module!"
, EntryC, &M, GV, GV->getParent()); return; } } while (
false)
;
2262 continue;
2263 }
2264
2265 // Visit all sub-expressions.
2266 for (const Use &U : C->operands()) {
2267 const auto *OpC = dyn_cast<Constant>(U);
2268 if (!OpC)
2269 continue;
2270 if (!ConstantExprVisited.insert(OpC).second)
2271 continue;
2272 Stack.push_back(OpC);
2273 }
2274 }
2275}
2276
2277void Verifier::visitConstantExpr(const ConstantExpr *CE) {
2278 if (CE->getOpcode() == Instruction::BitCast)
2279 Check(CastInst::castIsValid(Instruction::BitCast, CE->getOperand(0),do { if (!(CastInst::castIsValid(Instruction::BitCast, CE->
getOperand(0), CE->getType()))) { CheckFailed("Invalid bitcast"
, CE); return; } } while (false)
2280 CE->getType()),do { if (!(CastInst::castIsValid(Instruction::BitCast, CE->
getOperand(0), CE->getType()))) { CheckFailed("Invalid bitcast"
, CE); return; } } while (false)
2281 "Invalid bitcast", CE)do { if (!(CastInst::castIsValid(Instruction::BitCast, CE->
getOperand(0), CE->getType()))) { CheckFailed("Invalid bitcast"
, CE); return; } } while (false)
;
2282}
2283
2284bool Verifier::verifyAttributeCount(AttributeList Attrs, unsigned Params) {
2285 // There shouldn't be more attribute sets than there are parameters plus the
2286 // function and return value.
2287 return Attrs.getNumAttrSets() <= Params + 2;
2288}
2289
2290void Verifier::verifyInlineAsmCall(const CallBase &Call) {
2291 const InlineAsm *IA = cast<InlineAsm>(Call.getCalledOperand());
2292 unsigned ArgNo = 0;
2293 unsigned LabelNo = 0;
2294 for (const InlineAsm::ConstraintInfo &CI : IA->ParseConstraints()) {
2295 if (CI.Type == InlineAsm::isLabel) {
2296 ++LabelNo;
2297 continue;
2298 }
2299
2300 // Only deal with constraints that correspond to call arguments.
2301 if (!CI.hasArg())
2302 continue;
2303
2304 if (CI.isIndirect) {
2305 const Value *Arg = Call.getArgOperand(ArgNo);
2306 Check(Arg->getType()->isPointerTy(),do { if (!(Arg->getType()->isPointerTy())) { CheckFailed
("Operand for indirect constraint must have pointer type", &
Call); return; } } while (false)
2307 "Operand for indirect constraint must have pointer type", &Call)do { if (!(Arg->getType()->isPointerTy())) { CheckFailed
("Operand for indirect constraint must have pointer type", &
Call); return; } } while (false)
;
2308
2309 Check(Call.getParamElementType(ArgNo),do { if (!(Call.getParamElementType(ArgNo))) { CheckFailed("Operand for indirect constraint must have elementtype attribute"
, &Call); return; } } while (false)
2310 "Operand for indirect constraint must have elementtype attribute",do { if (!(Call.getParamElementType(ArgNo))) { CheckFailed("Operand for indirect constraint must have elementtype attribute"
, &Call); return; } } while (false)
2311 &Call)do { if (!(Call.getParamElementType(ArgNo))) { CheckFailed("Operand for indirect constraint must have elementtype attribute"
, &Call); return; } } while (false)
;
2312 } else {
2313 Check(!Call.paramHasAttr(ArgNo, Attribute::ElementType),do { if (!(!Call.paramHasAttr(ArgNo, Attribute::ElementType))
) { CheckFailed("Elementtype attribute can only be applied for indirect "
"constraints", &Call); return; } } while (false)
2314 "Elementtype attribute can only be applied for indirect "do { if (!(!Call.paramHasAttr(ArgNo, Attribute::ElementType))
) { CheckFailed("Elementtype attribute can only be applied for indirect "
"constraints", &Call); return; } } while (false)
2315 "constraints",do { if (!(!Call.paramHasAttr(ArgNo, Attribute::ElementType))
) { CheckFailed("Elementtype attribute can only be applied for indirect "
"constraints", &Call); return; } } while (false)
2316 &Call)do { if (!(!Call.paramHasAttr(ArgNo, Attribute::ElementType))
) { CheckFailed("Elementtype attribute can only be applied for indirect "
"constraints", &Call); return; } } while (false)
;
2317 }
2318
2319 ArgNo++;
2320 }
2321
2322 if (auto *CallBr = dyn_cast<CallBrInst>(&Call)) {
2323 Check(LabelNo == CallBr->getNumIndirectDests(),do { if (!(LabelNo == CallBr->getNumIndirectDests())) { CheckFailed
("Number of label constraints does not match number of callbr dests"
, &Call); return; } } while (false)
2324 "Number of label constraints does not match number of callbr dests",do { if (!(LabelNo == CallBr->getNumIndirectDests())) { CheckFailed
("Number of label constraints does not match number of callbr dests"
, &Call); return; } } while (false)
2325 &Call)do { if (!(LabelNo == CallBr->getNumIndirectDests())) { CheckFailed
("Number of label constraints does not match number of callbr dests"
, &Call); return; } } while (false)
;
2326 } else {
2327 Check(LabelNo == 0, "Label constraints can only be used with callbr",do { if (!(LabelNo == 0)) { CheckFailed("Label constraints can only be used with callbr"
, &Call); return; } } while (false)
2328 &Call)do { if (!(LabelNo == 0)) { CheckFailed("Label constraints can only be used with callbr"
, &Call); return; } } while (false)
;
2329 }
2330}
2331
2332/// Verify that statepoint intrinsic is well formed.
2333void Verifier::verifyStatepoint(const CallBase &Call) {
2334 assert(Call.getCalledFunction() &&(static_cast <bool> (Call.getCalledFunction() &&
Call.getCalledFunction()->getIntrinsicID() == Intrinsic::
experimental_gc_statepoint) ? void (0) : __assert_fail ("Call.getCalledFunction() && Call.getCalledFunction()->getIntrinsicID() == Intrinsic::experimental_gc_statepoint"
, "llvm/lib/IR/Verifier.cpp", 2336, __extension__ __PRETTY_FUNCTION__
))
2335 Call.getCalledFunction()->getIntrinsicID() ==(static_cast <bool> (Call.getCalledFunction() &&
Call.getCalledFunction()->getIntrinsicID() == Intrinsic::
experimental_gc_statepoint) ? void (0) : __assert_fail ("Call.getCalledFunction() && Call.getCalledFunction()->getIntrinsicID() == Intrinsic::experimental_gc_statepoint"
, "llvm/lib/IR/Verifier.cpp", 2336, __extension__ __PRETTY_FUNCTION__
))
2336 Intrinsic::experimental_gc_statepoint)(static_cast <bool> (Call.getCalledFunction() &&
Call.getCalledFunction()->getIntrinsicID() == Intrinsic::
experimental_gc_statepoint) ? void (0) : __assert_fail ("Call.getCalledFunction() && Call.getCalledFunction()->getIntrinsicID() == Intrinsic::experimental_gc_statepoint"
, "llvm/lib/IR/Verifier.cpp", 2336, __extension__ __PRETTY_FUNCTION__
))
;
2337
2338 Check(!Call.doesNotAccessMemory() && !Call.onlyReadsMemory() &&do { if (!(!Call.doesNotAccessMemory() && !Call.onlyReadsMemory
() && !Call.onlyAccessesArgMemory())) { CheckFailed("gc.statepoint must read and write all memory to preserve "
"reordering restrictions required by safepoint semantics", Call
); return; } } while (false)
2339 !Call.onlyAccessesArgMemory(),do { if (!(!Call.doesNotAccessMemory() && !Call.onlyReadsMemory
() && !Call.onlyAccessesArgMemory())) { CheckFailed("gc.statepoint must read and write all memory to preserve "
"reordering restrictions required by safepoint semantics", Call
); return; } } while (false)
2340 "gc.statepoint must read and write all memory to preserve "do { if (!(!Call.doesNotAccessMemory() && !Call.onlyReadsMemory
() && !Call.onlyAccessesArgMemory())) { CheckFailed("gc.statepoint must read and write all memory to preserve "
"reordering restrictions required by safepoint semantics", Call
); return; } } while (false)
2341 "reordering restrictions required by safepoint semantics",do { if (!(!Call.doesNotAccessMemory() && !Call.onlyReadsMemory
() && !Call.onlyAccessesArgMemory())) { CheckFailed("gc.statepoint must read and write all memory to preserve "
"reordering restrictions required by safepoint semantics", Call
); return; } } while (false)
2342 Call)do { if (!(!Call.doesNotAccessMemory() && !Call.onlyReadsMemory
() && !Call.onlyAccessesArgMemory())) { CheckFailed("gc.statepoint must read and write all memory to preserve "
"reordering restrictions required by safepoint semantics", Call
); return; } } while (false)
;
2343
2344 const int64_t NumPatchBytes =
2345 cast<ConstantInt>(Call.getArgOperand(1))->getSExtValue();
2346 assert(isInt<32>(NumPatchBytes) && "NumPatchBytesV is an i32!")(static_cast <bool> (isInt<32>(NumPatchBytes) &&
"NumPatchBytesV is an i32!") ? void (0) : __assert_fail ("isInt<32>(NumPatchBytes) && \"NumPatchBytesV is an i32!\""
, "llvm/lib/IR/Verifier.cpp", 2346, __extension__ __PRETTY_FUNCTION__
))
;
2347 Check(NumPatchBytes >= 0,do { if (!(NumPatchBytes >= 0)) { CheckFailed("gc.statepoint number of patchable bytes must be "
"positive", Call); return; } } while (false)
2348 "gc.statepoint number of patchable bytes must be "do { if (!(NumPatchBytes >= 0)) { CheckFailed("gc.statepoint number of patchable bytes must be "
"positive", Call); return; } } while (false)
2349 "positive",do { if (!(NumPatchBytes >= 0)) { CheckFailed("gc.statepoint number of patchable bytes must be "
"positive", Call); return; } } while (false)
2350 Call)do { if (!(NumPatchBytes >= 0)) { CheckFailed("gc.statepoint number of patchable bytes must be "
"positive", Call); return; } } while (false)
;
2351
2352 Type *TargetElemType = Call.getParamElementType(2);
2353 Check(TargetElemType,do { if (!(TargetElemType)) { CheckFailed("gc.statepoint callee argument must have elementtype attribute"
, Call); return; } } while (false)
2354 "gc.statepoint callee argument must have elementtype attribute", Call)do { if (!(TargetElemType)) { CheckFailed("gc.statepoint callee argument must have elementtype attribute"
, Call); return; } } while (false)
;
2355 FunctionType *TargetFuncType = dyn_cast<FunctionType>(TargetElemType);
2356 Check(TargetFuncType,do { if (!(TargetFuncType)) { CheckFailed("gc.statepoint callee elementtype must be function type"
, Call); return; } } while (false)
2357 "gc.statepoint callee elementtype must be function type", Call)do { if (!(TargetFuncType)) { CheckFailed("gc.statepoint callee elementtype must be function type"
, Call); return; } } while (false)
;
2358
2359 const int NumCallArgs = cast<ConstantInt>(Call.getArgOperand(3))->getZExtValue();
2360 Check(NumCallArgs >= 0,do { if (!(NumCallArgs >= 0)) { CheckFailed("gc.statepoint number of arguments to underlying call "
"must be positive", Call); return; } } while (false)
2361 "gc.statepoint number of arguments to underlying call "do { if (!(NumCallArgs >= 0)) { CheckFailed("gc.statepoint number of arguments to underlying call "
"must be positive", Call); return; } } while (false)
2362 "must be positive",do { if (!(NumCallArgs >= 0)) { CheckFailed("gc.statepoint number of arguments to underlying call "
"must be positive", Call); return; } } while (false)
2363 Call)do { if (!(NumCallArgs >= 0)) { CheckFailed("gc.statepoint number of arguments to underlying call "
"must be positive", Call); return; } } while (false)
;
2364 const int NumParams = (int)TargetFuncType->getNumParams();
2365 if (TargetFuncType->isVarArg()) {
2366 Check(NumCallArgs >= NumParams,do { if (!(NumCallArgs >= NumParams)) { CheckFailed("gc.statepoint mismatch in number of vararg call args"
, Call); return; } } while (false)
2367 "gc.statepoint mismatch in number of vararg call args", Call)do { if (!(NumCallArgs >= NumParams)) { CheckFailed("gc.statepoint mismatch in number of vararg call args"
, Call); return; } } while (false)
;
2368
2369 // TODO: Remove this limitation
2370 Check(TargetFuncType->getReturnType()->isVoidTy(),do { if (!(TargetFuncType->getReturnType()->isVoidTy())
) { CheckFailed("gc.statepoint doesn't support wrapping non-void "
"vararg functions yet", Call); return; } } while (false)
2371 "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", Call); return; } } while (false)
2372 "vararg functions yet",do { if (!(TargetFuncType->getReturnType()->isVoidTy())
) { CheckFailed("gc.statepoint doesn't support wrapping non-void "
"vararg functions yet", Call); return; } } while (false)
2373 Call)do { if (!(TargetFuncType->getReturnType()->isVoidTy())
) { CheckFailed("gc.statepoint doesn't support wrapping non-void "
"vararg functions yet", Call); return; } } while (false)
;
2374 } else
2375 Check(NumCallArgs == NumParams,do { if (!(NumCallArgs == NumParams)) { CheckFailed("gc.statepoint mismatch in number of call args"
, Call); return; } } while (false)
2376 "gc.statepoint mismatch in number of call args", Call)do { if (!(NumCallArgs == NumParams)) { CheckFailed("gc.statepoint mismatch in number of call args"
, Call); return; } } while (false)
;
2377
2378 const uint64_t Flags
2379 = cast<ConstantInt>(Call.getArgOperand(4))->getZExtValue();
2380 Check((Flags & ~(uint64_t)StatepointFlags::MaskAll) == 0,do { if (!((Flags & ~(uint64_t)StatepointFlags::MaskAll) ==
0)) { CheckFailed("unknown flag used in gc.statepoint flags argument"
, Call); return; } } while (false)
2381 "unknown flag used in gc.statepoint flags argument", Call)do { if (!((Flags & ~(uint64_t)StatepointFlags::MaskAll) ==
0)) { CheckFailed("unknown flag used in gc.statepoint flags argument"
, Call); return; } } while (false)
;
2382
2383 // Verify that the types of the call parameter arguments match
2384 // the type of the wrapped callee.
2385 AttributeList Attrs = Call.getAttributes();
2386 for (int i = 0; i < NumParams; i++) {
2387 Type *ParamType = TargetFuncType->getParamType(i);
2388 Type *ArgType = Call.getArgOperand(5 + i)->getType();
2389 Check(ArgType == ParamType,do { if (!(ArgType == ParamType)) { CheckFailed("gc.statepoint call argument does not match wrapped "
"function type", Call); return; } } while (false)
2390 "gc.statepoint call argument does not match wrapped "do { if (!(ArgType == ParamType)) { CheckFailed("gc.statepoint call argument does not match wrapped "
"function type", Call); return; } } while (false)
2391 "function type",do { if (!(ArgType == ParamType)) { CheckFailed("gc.statepoint call argument does not match wrapped "
"function type", Call); return; } } while (false)
2392 Call)do { if (!(ArgType == ParamType)) { CheckFailed("gc.statepoint call argument does not match wrapped "
"function type", Call); return; } } while (false)
;
2393
2394 if (TargetFuncType->isVarArg()) {
2395 AttributeSet ArgAttrs = Attrs.getParamAttrs(5 + i);
2396 Check(!ArgAttrs.hasAttribute(Attribute::StructRet),do { if (!(!ArgAttrs.hasAttribute(Attribute::StructRet))) { CheckFailed
("Attribute 'sret' cannot be used for vararg call arguments!"
, Call); return; } } while (false)
2397 "Attribute 'sret' cannot be used for vararg call arguments!", Call)do { if (!(!ArgAttrs.hasAttribute(Attribute::StructRet))) { CheckFailed
("Attribute 'sret' cannot be used for vararg call arguments!"
, Call); return; } } while (false)
;
2398 }
2399 }
2400
2401 const int EndCallArgsInx = 4 + NumCallArgs;
2402
2403 const Value *NumTransitionArgsV = Call.getArgOperand(EndCallArgsInx + 1);
2404 Check(isa<ConstantInt>(NumTransitionArgsV),do { if (!(isa<ConstantInt>(NumTransitionArgsV))) { CheckFailed
("gc.statepoint number of transition arguments " "must be constant integer"
, Call); return; } } while (false)
2405 "gc.statepoint number of transition arguments "do { if (!(isa<ConstantInt>(NumTransitionArgsV))) { CheckFailed
("gc.statepoint number of transition arguments " "must be constant integer"
, Call); return; } } while (false)
2406 "must be constant integer",do { if (!(isa<ConstantInt>(NumTransitionArgsV))) { CheckFailed
("gc.statepoint number of transition arguments " "must be constant integer"
, Call); return; } } while (false)
2407 Call)do { if (!(isa<ConstantInt>(NumTransitionArgsV))) { CheckFailed
("gc.statepoint number of transition arguments " "must be constant integer"
, Call); return; } } while (false)
;
2408 const int NumTransitionArgs =
2409 cast<ConstantInt>(NumTransitionArgsV)->getZExtValue();
2410 Check(NumTransitionArgs == 0,do { if (!(NumTransitionArgs == 0)) { CheckFailed("gc.statepoint w/inline transition bundle is deprecated"
, Call); return; } } while (false)
2411 "gc.statepoint w/inline transition bundle is deprecated", Call)do { if (!(NumTransitionArgs == 0)) { CheckFailed("gc.statepoint w/inline transition bundle is deprecated"
, Call); return; } } while (false)
;
2412 const int EndTransitionArgsInx = EndCallArgsInx + 1 + NumTransitionArgs;
2413
2414 const Value *NumDeoptArgsV = Call.getArgOperand(EndTransitionArgsInx + 1);
2415 Check(isa<ConstantInt>(NumDeoptArgsV),do { if (!(isa<ConstantInt>(NumDeoptArgsV))) { CheckFailed
("gc.statepoint number of deoptimization arguments " "must be constant integer"
, Call); return; } } while (false)
2416 "gc.statepoint number of deoptimization arguments "do { if (!(isa<ConstantInt>(NumDeoptArgsV))) { CheckFailed
("gc.statepoint number of deoptimization arguments " "must be constant integer"
, Call); return; } } while (false)
2417 "must be constant integer",do { if (!(isa<ConstantInt>(NumDeoptArgsV))) { CheckFailed
("gc.statepoint number of deoptimization arguments " "must be constant integer"
, Call); return; } } while (false)
2418 Call)do { if (!(isa<ConstantInt>(NumDeoptArgsV))) { CheckFailed
("gc.statepoint number of deoptimization arguments " "must be constant integer"
, Call); return; } } while (false)
;
2419 const int NumDeoptArgs = cast<ConstantInt>(NumDeoptArgsV)->getZExtValue();
2420 Check(NumDeoptArgs == 0,do { if (!(NumDeoptArgs == 0)) { CheckFailed("gc.statepoint w/inline deopt operands is deprecated"
, Call); return; } } while (false)
2421 "gc.statepoint w/inline deopt operands is deprecated", Call)do { if (!(NumDeoptArgs == 0)) { CheckFailed("gc.statepoint w/inline deopt operands is deprecated"
, Call); return; } } while (false)
;
2422
2423 const int ExpectedNumArgs = 7 + NumCallArgs;
2424 Check(ExpectedNumArgs == (int)Call.arg_size(),do { if (!(ExpectedNumArgs == (int)Call.arg_size())) { CheckFailed
("gc.statepoint too many arguments", Call); return; } } while
(false)
2425 "gc.statepoint too many arguments", Call)do { if (!(ExpectedNumArgs == (int)Call.arg_size())) { CheckFailed
("gc.statepoint too many arguments", Call); return; } } while
(false)
;
2426
2427 // Check that the only uses of this gc.statepoint are gc.result or
2428 // gc.relocate calls which are tied to this statepoint and thus part
2429 // of the same statepoint sequence
2430 for (const User *U : Call.users()) {
2431 const CallInst *UserCall = dyn_cast<const CallInst>(U);
2432 Check(UserCall, "illegal use of statepoint token", Call, U)do { if (!(UserCall)) { CheckFailed("illegal use of statepoint token"
, Call, U); return; } } while (false)
;
2433 if (!UserCall)
2434 continue;
2435 Check(isa<GCRelocateInst>(UserCall) || isa<GCResultInst>(UserCall),do { if (!(isa<GCRelocateInst>(UserCall) || isa<GCResultInst
>(UserCall))) { CheckFailed("gc.result or gc.relocate are the only value uses "
"of a gc.statepoint", Call, U); return; } } while (false)
2436 "gc.result or gc.relocate are the only value uses "do { if (!(isa<GCRelocateInst>(UserCall) || isa<GCResultInst
>(UserCall))) { CheckFailed("gc.result or gc.relocate are the only value uses "
"of a gc.statepoint", Call, U); return; } } while (false)
2437 "of a gc.statepoint",do { if (!(isa<GCRelocateInst>(UserCall) || isa<GCResultInst
>(UserCall))) { CheckFailed("gc.result or gc.relocate are the only value uses "
"of a gc.statepoint", Call, U); return; } } while (false)
2438 Call, U)do { if (!(isa<GCRelocateInst>(UserCall) || isa<GCResultInst
>(UserCall))) { CheckFailed("gc.result or gc.relocate are the only value uses "
"of a gc.statepoint", Call, U); return; } } while (false)
;
2439 if (isa<GCResultInst>(UserCall)) {
2440 Check(UserCall->getArgOperand(0) == &Call,do { if (!(UserCall->getArgOperand(0) == &Call)) { CheckFailed
("gc.result connected to wrong gc.statepoint", Call, UserCall
); return; } } while (false)
2441 "gc.result connected to wrong gc.statepoint", Call, UserCall)do { if (!(UserCall->getArgOperand(0) == &Call)) { CheckFailed
("gc.result connected to wrong gc.statepoint", Call, UserCall
); return; } } while (false)
;
2442 } else if (isa<GCRelocateInst>(Call)) {
2443 Check(UserCall->getArgOperand(0) == &Call,do { if (!(UserCall->getArgOperand(0) == &Call)) { CheckFailed
("gc.relocate connected to wrong gc.statepoint", Call, UserCall
); return; } } while (false)
2444 "gc.relocate connected to wrong gc.statepoint", Call, UserCall)do { if (!(UserCall->getArgOperand(0) == &Call)) { CheckFailed
("gc.relocate connected to wrong gc.statepoint", Call, UserCall
); return; } } while (false)
;
2445 }
2446 }
2447
2448 // Note: It is legal for a single derived pointer to be listed multiple
2449 // times. It's non-optimal, but it is legal. It can also happen after
2450 // insertion if we strip a bitcast away.
2451 // Note: It is really tempting to check that each base is relocated and
2452 // that a derived pointer is never reused as a base pointer. This turns
2453 // out to be problematic since optimizations run after safepoint insertion
2454 // can recognize equality properties that the insertion logic doesn't know
2455 // about. See example statepoint.ll in the verifier subdirectory
2456}
2457
2458void Verifier::verifyFrameRecoverIndices() {
2459 for (auto &Counts : FrameEscapeInfo) {
2460 Function *F = Counts.first;
2461 unsigned EscapedObjectCount = Counts.second.first;
2462 unsigned MaxRecoveredIndex = Counts.second.second;
2463 Check(MaxRecoveredIndex <= EscapedObjectCount,do { if (!(MaxRecoveredIndex <= EscapedObjectCount)) { CheckFailed
("all indices passed to llvm.localrecover must be less than the "
"number of arguments passed to llvm.localescape in the parent "
"function", F); return; } } while (false)
2464 "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 to llvm.localescape in the parent "
"function", F); return; } } while (false)
2465 "number of arguments passed to 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 to llvm.localescape in the parent "
"function", F); return; } } while (false)
2466 "function",do { if (!(MaxRecoveredIndex <= EscapedObjectCount)) { CheckFailed
("all indices passed to llvm.localrecover must be less than the "
"number of arguments passed to llvm.localescape in the parent "
"function", F); return; } } while (false)
2467 F)do { if (!(MaxRecoveredIndex <= EscapedObjectCount)) { CheckFailed
("all indices passed to llvm.localrecover must be less than the "
"number of arguments passed to llvm.localescape in the parent "
"function", F); return; } } while (false)
;
2468 }
2469}
2470
2471static Instruction *getSuccPad(Instruction *Terminator) {
2472 BasicBlock *UnwindDest;
2473 if (auto *II = dyn_cast<InvokeInst>(Terminator))
2474 UnwindDest = II->getUnwindDest();
2475 else if (auto *CSI = dyn_cast<CatchSwitchInst>(Terminator))
2476 UnwindDest = CSI->getUnwindDest();
2477 else
2478 UnwindDest = cast<CleanupReturnInst>(Terminator)->getUnwindDest();
2479 return UnwindDest->getFirstNonPHI();
2480}
2481
2482void Verifier::verifySiblingFuncletUnwinds() {
2483 SmallPtrSet<Instruction *, 8> Visited;
2484 SmallPtrSet<Instruction *, 8> Active;
2485 for (const auto &Pair : SiblingFuncletInfo) {
2486 Instruction *PredPad = Pair.first;
2487 if (Visited.count(PredPad))
2488 continue;
2489 Active.insert(PredPad);
2490 Instruction *Terminator = Pair.second;
2491 do {
2492 Instruction *SuccPad = getSuccPad(Terminator);
2493 if (Active.count(SuccPad)) {
2494 // Found a cycle; report error
2495 Instruction *CyclePad = SuccPad;
2496 SmallVector<Instruction *, 8> CycleNodes;
2497 do {
2498 CycleNodes.push_back(CyclePad);
2499 Instruction *CycleTerminator = SiblingFuncletInfo[CyclePad];
2500 if (CycleTerminator != CyclePad)
2501 CycleNodes.push_back(CycleTerminator);
2502 CyclePad = getSuccPad(CycleTerminator);
2503 } while (CyclePad != SuccPad);
2504 Check(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
(false)
2505 ArrayRef<Instruction *>(CycleNodes))do { if (!(false)) { CheckFailed("EH pads can't handle each other's exceptions"
, ArrayRef<Instruction *>(CycleNodes)); return; } } while
(false)
;
2506 }
2507 // Don't re-walk a node we've already checked
2508 if (!Visited.insert(SuccPad).second)
2509 break;
2510 // Walk to this successor if it has a map entry.
2511 PredPad = SuccPad;
2512 auto TermI = SiblingFuncletInfo.find(PredPad);
2513 if (TermI == SiblingFuncletInfo.end())
2514 break;
2515 Terminator = TermI->second;
2516 Active.insert(PredPad);
2517 } while (true);
2518 // Each node only has one successor, so we've walked all the active
2519 // nodes' successors.
2520 Active.clear();
2521 }
2522}
2523
2524// visitFunction - Verify that a function is ok.
2525//
2526void Verifier::visitFunction(const Function &F) {
2527 visitGlobalValue(F);
2528
2529 // Check function arguments.
2530 FunctionType *FT = F.getFunctionType();
2531 unsigned NumArgs = F.arg_size();
2532
2533 Check(&Context == &F.getContext(),do { if (!(&Context == &F.getContext())) { CheckFailed
("Function context does not match Module context!", &F); return
; } } while (false)
1
Assuming the condition is true
2
Taking false branch
3
Loop condition is false. Exiting loop
2534 "Function context does not match Module context!", &F)do { if (!(&Context == &F.getContext())) { CheckFailed
("Function context does not match Module context!", &F); return
; } } while (false)
;
2535
2536 Check(!F.hasCommonLinkage(), "Functions may not have common linkage", &F)do { if (!(!F.hasCommonLinkage())) { CheckFailed("Functions may not have common linkage"
, &F); return; } } while (false)
;
4
Taking false branch
5
Loop condition is false. Exiting loop
2537 Check(FT->getNumParams() == NumArgs,do { if (!(FT->getNumParams() == NumArgs)) { CheckFailed("# formal arguments must match # of arguments for function type!"
, &F, FT); return; } } while (false)
6
Assuming the condition is true
7
Taking false branch
2538 "# 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 (false)
2539 FT)do { if (!(FT->getNumParams() == NumArgs)) { CheckFailed("# formal arguments must match # of arguments for function type!"
, &F, FT); return; } } while (false)
;
2540 Check(F.getReturnType()->isFirstClassType() ||do { if (!(F.getReturnType()->isFirstClassType() || F.getReturnType
()->isVoidTy() || F.getReturnType()->isStructTy())) { CheckFailed
("Functions cannot return aggregate values!", &F); return
; } } while (false)
8
Loop condition is false. Exiting loop
9
Taking false branch
2541 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 (false)
2542 "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 (false)
;
2543
2544 Check(!F.hasStructRetAttr() || F.getReturnType()->isVoidTy(),do { if (!(!F.hasStructRetAttr() || F.getReturnType()->isVoidTy
())) { CheckFailed("Invalid struct return type!", &F); return
; } } while (false)
10
Loop condition is false. Exiting loop
11
Assuming the condition is true
12
Taking false branch
13
Loop condition is false. Exiting loop
2545 "Invalid struct return type!", &F)do { if (!(!F.hasStructRetAttr() || F.getReturnType()->isVoidTy
())) { CheckFailed("Invalid struct return type!", &F); return
; } } while (false)
;
2546
2547 AttributeList Attrs = F.getAttributes();
2548
2549 Check(verifyAttributeCount(Attrs, FT->getNumParams()),do { if (!(verifyAttributeCount(Attrs, FT->getNumParams())
)) { CheckFailed("Attribute after last parameter!", &F); return
; } } while (false)
14
Taking false branch
15
Loop condition is false. Exiting loop
2550 "Attribute after last parameter!", &F)do { if (!(verifyAttributeCount(Attrs, FT->getNumParams())
)) { CheckFailed("Attribute after last parameter!", &F); return
; } } while (false)
;
2551
2552 bool IsIntrinsic = F.isIntrinsic();
2553
2554 // Check function attributes.
2555 verifyFunctionAttrs(FT, Attrs, &F, IsIntrinsic, /* IsInlineAsm */ false);
2556
2557 // On function declarations/definitions, we do not support the builtin
2558 // attribute. We do not check this in VerifyFunctionAttrs since that is
2559 // checking for Attributes that can/can not ever be on functions.
2560 Check(!Attrs.hasFnAttr(Attribute::Builtin),do { if (!(!Attrs.hasFnAttr(Attribute::Builtin))) { CheckFailed
("Attribute 'builtin' can only be applied to a callsite.", &
F); return; } } while (false)
16
Assuming the condition is true
17
Taking false branch
18
Loop condition is false. Exiting loop
2561 "Attribute 'builtin' can only be applied to a callsite.", &F)do { if (!(!Attrs.hasFnAttr(Attribute::Builtin))) { CheckFailed
("Attribute 'builtin' can only be applied to a callsite.", &
F); return; } } while (false)
;
2562
2563 Check(!Attrs.hasAttrSomewhere(Attribute::ElementType),do { if (!(!Attrs.hasAttrSomewhere(Attribute::ElementType))) {
CheckFailed("Attribute 'elementtype' can only be applied to a callsite."
, &F); return; } } while (false)
19
Assuming the condition is true
20
Taking false branch
21
Loop condition is false. Exiting loop
2564 "Attribute 'elementtype' can only be applied to a callsite.", &F)do { if (!(!Attrs.hasAttrSomewhere(Attribute::ElementType))) {
CheckFailed("Attribute 'elementtype' can only be applied to a callsite."
, &F); return; } } while (false)
;
2565
2566 // Check that this function meets the restrictions on this calling convention.
2567 // Sometimes varargs is used for perfectly forwarding thunks, so some of these
2568 // restrictions can be lifted.
2569 switch (F.getCallingConv()) {
22
Control jumps to 'case C:' at line 2571
2570 default:
2571 case CallingConv::C:
2572 break;
2573 case CallingConv::X86_INTR: {
2574 Check(F.arg_empty() || Attrs.hasParamAttr(0, Attribute::ByVal),do { if (!(F.arg_empty() || Attrs.hasParamAttr(0, Attribute::
ByVal))) { CheckFailed("Calling convention parameter requires byval"
, &F); return; } } while (false)
2575 "Calling convention parameter requires byval", &F)do { if (!(F.arg_empty() || Attrs.hasParamAttr(0, Attribute::
ByVal))) { CheckFailed("Calling convention parameter requires byval"
, &F); return; } } while (false)
;
2576 break;
2577 }
2578 case CallingConv::AMDGPU_KERNEL:
2579 case CallingConv::SPIR_KERNEL:
2580 Check(F.getReturnType()->isVoidTy(),do { if (!(F.getReturnType()->isVoidTy())) { CheckFailed("Calling convention requires void return type"
, &F); return; } } while (false)
2581 "Calling convention requires void return type", &F)do { if (!(F.getReturnType()->isVoidTy())) { CheckFailed("Calling convention requires void return type"
, &F); return; } } while (false)
;
2582 [[fallthrough]];
2583 case CallingConv::AMDGPU_VS:
2584 case CallingConv::AMDGPU_HS:
2585 case CallingConv::AMDGPU_GS:
2586 case CallingConv::AMDGPU_PS:
2587 case CallingConv::AMDGPU_CS:
2588 Check(!F.hasStructRetAttr(), "Calling convention does not allow sret", &F)do { if (!(!F.hasStructRetAttr())) { CheckFailed("Calling convention does not allow sret"
, &F); return; } } while (false)
;
2589 if (F.getCallingConv() != CallingConv::SPIR_KERNEL) {
2590 const unsigned StackAS = DL.getAllocaAddrSpace();
2591 unsigned i = 0;
2592 for (const Argument &Arg : F.args()) {
2593 Check(!Attrs.hasParamAttr(i, Attribute::ByVal),do { if (!(!Attrs.hasParamAttr(i, Attribute::ByVal))) { CheckFailed
("Calling convention disallows byval", &F); return; } } while
(false)
2594 "Calling convention disallows byval", &F)do { if (!(!Attrs.hasParamAttr(i, Attribute::ByVal))) { CheckFailed
("Calling convention disallows byval", &F); return; } } while
(false)
;
2595 Check(!Attrs.hasParamAttr(i, Attribute::Preallocated),do { if (!(!Attrs.hasParamAttr(i, Attribute::Preallocated))) {
CheckFailed("Calling convention disallows preallocated", &
F); return; } } while (false)
2596 "Calling convention disallows preallocated", &F)do { if (!(!Attrs.hasParamAttr(i, Attribute::Preallocated))) {
CheckFailed("Calling convention disallows preallocated", &
F); return; } } while (false)
;
2597 Check(!Attrs.hasParamAttr(i, Attribute::InAlloca),do { if (!(!Attrs.hasParamAttr(i, Attribute::InAlloca))) { CheckFailed
("Calling convention disallows inalloca", &F); return; } }
while (false)
2598 "Calling convention disallows inalloca", &F)do { if (!(!Attrs.hasParamAttr(i, Attribute::InAlloca))) { CheckFailed
("Calling convention disallows inalloca", &F); return; } }
while (false)
;
2599
2600 if (Attrs.hasParamAttr(i, Attribute::ByRef)) {
2601 // FIXME: Should also disallow LDS and GDS, but we don't have the enum
2602 // value here.
2603 Check(Arg.getType()->getPointerAddressSpace() != StackAS,do { if (!(Arg.getType()->getPointerAddressSpace() != StackAS
)) { CheckFailed("Calling convention disallows stack byref", &
F); return; } } while (false)
2604 "Calling convention disallows stack byref", &F)do { if (!(Arg.getType()->getPointerAddressSpace() != StackAS
)) { CheckFailed("Calling convention disallows stack byref", &
F); return; } } while (false)
;
2605 }
2606
2607 ++i;
2608 }
2609 }
2610
2611 [[fallthrough]];
2612 case CallingConv::Fast:
2613 case CallingConv::Cold:
2614 case CallingConv::Intel_OCL_BI:
2615 case CallingConv::PTX_Kernel:
2616 case CallingConv::PTX_Device:
2617 Check(!F.isVarArg(),do { if (!(!F.isVarArg())) { CheckFailed("Calling convention does not support varargs or "
"perfect forwarding!", &F); return; } } while (false)
2618 "Calling convention does not support varargs or "do { if (!(!F.isVarArg())) { CheckFailed("Calling convention does not support varargs or "
"perfect forwarding!", &F); return; } } while (false)
2619 "perfect forwarding!",do { if (!(!F.isVarArg())) { CheckFailed("Calling convention does not support varargs or "
"perfect forwarding!", &F); return; } } while (false)
2620 &F)do { if (!(!F.isVarArg())) { CheckFailed("Calling convention does not support varargs or "
"perfect forwarding!", &F); return; } } while (false)
;
2621 break;
2622 }
2623
2624 // Check that the argument values match the function type for this function...
2625 unsigned i = 0;
23
Execution continues on line 2625
2626 for (const Argument &Arg : F.args()) {
24
Assuming '__begin1' is equal to '__end1'
2627 Check(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 (false)
2628 "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 (false)
2629 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 (false)
;
2630 Check(Arg.getType()->isFirstClassType(),do { if (!(Arg.getType()->isFirstClassType())) { CheckFailed
("Function arguments must have first-class types!", &Arg)
; return; } } while (false)
2631 "Function arguments must have first-class types!", &Arg)do { if (!(Arg.getType()->isFirstClassType())) { CheckFailed
("Function arguments must have first-class types!", &Arg)
; return; } } while (false)
;
2632 if (!IsIntrinsic) {
2633 Check(!Arg.getType()->isMetadataTy(),do { if (!(!Arg.getType()->isMetadataTy())) { CheckFailed(
"Function takes metadata but isn't an intrinsic", &Arg, &
F); return; } } while (false)
2634 "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 (false)
;
2635 Check(!Arg.getType()->isTokenTy(),do { if (!(!Arg.getType()->isTokenTy())) { CheckFailed("Function takes token but isn't an intrinsic"
, &Arg, &F); return; } } while (false)
2636 "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 (false)
;
2637 Check(!Arg.getType()->isX86_AMXTy(),do { if (!(!Arg.getType()->isX86_AMXTy())) { CheckFailed("Function takes x86_amx but isn't an intrinsic"
, &Arg, &F); return; } } while (false)
2638 "Function takes x86_amx but isn't an intrinsic", &Arg, &F)do { if (!(!Arg.getType()->isX86_AMXTy())) { CheckFailed("Function takes x86_amx but isn't an intrinsic"
, &Arg, &F); return; } } while (false)
;
2639 }
2640
2641 // Check that swifterror argument is only used by loads and stores.
2642 if (Attrs.hasParamAttr(i, Attribute::SwiftError)) {
2643 verifySwiftErrorValue(&Arg);
2644 }
2645 ++i;
2646 }
2647
2648 if (!IsIntrinsic) {
25
Assuming 'IsIntrinsic' is true
26
Taking false branch
2649 Check(!F.getReturnType()->isTokenTy(),do { if (!(!F.getReturnType()->isTokenTy())) { CheckFailed
("Function returns a token but isn't an intrinsic", &F); return
; } } while (false)
2650 "Function returns a token but isn't an intrinsic", &F)do { if (!(!F.getReturnType()->isTokenTy())) { CheckFailed
("Function returns a token but isn't an intrinsic", &F); return
; } } while (false)
;
2651 Check(!F.getReturnType()->isX86_AMXTy(),do { if (!(!F.getReturnType()->isX86_AMXTy())) { CheckFailed
("Function returns a x86_amx but isn't an intrinsic", &F)
; return; } } while (false)
2652 "Function returns a x86_amx but isn't an intrinsic", &F)do { if (!(!F.getReturnType()->isX86_AMXTy())) { CheckFailed
("Function returns a x86_amx but isn't an intrinsic", &F)
; return; } } while (false)
;
2653 }
2654
2655 // Get the function metadata attachments.
2656 SmallVector<std::pair<unsigned, MDNode *>, 4> MDs;
2657 F.getAllMetadata(MDs);
2658 assert(F.hasMetadata() != MDs.empty() && "Bit out-of-sync")(static_cast <bool> (F.hasMetadata() != MDs.empty() &&
"Bit out-of-sync") ? void (0) : __assert_fail ("F.hasMetadata() != MDs.empty() && \"Bit out-of-sync\""
, "llvm/lib/IR/Verifier.cpp", 2658, __extension__ __PRETTY_FUNCTION__
))
;
27
Assuming the condition is true
28
'?' condition is true
2659 verifyFunctionMetadata(MDs);
2660
2661 // Check validity of the personality function
2662 if (F.hasPersonalityFn()) {
29
Assuming the condition is false
30
Taking false branch
2663 auto *Per = dyn_cast<Function>(F.getPersonalityFn()->stripPointerCasts());
2664 if (Per)
2665 Check(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
(false)
2666 "Referencing personality function in another module!", &F,do { if (!(Per->getParent() == F.getParent())) { CheckFailed
("Referencing personality function in another module!", &
F, F.getParent(), Per, Per->getParent()); return; } } while
(false)
2667 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
(false)
;
2668 }
2669
2670 // EH funclet coloring can be expensive, recompute on-demand
2671 BlockEHFuncletColors.clear();
2672
2673 if (F.isMaterializable()) {
31
Assuming the condition is false
32
Taking false branch
2674 // Function has a body somewhere we can't see.
2675 Check(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 (false)
2676 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 (false)
;
2677 } else if (F.isDeclaration()) {
33
Assuming the condition is true
34
Taking true branch
2678 for (const auto &I : MDs) {
35
Assuming '__begin3' is equal to '__end3'
2679 // This is used for call site debug information.
2680 CheckDI(I.first != LLVMContext::MD_dbg ||do { if (!(I.first != LLVMContext::MD_dbg || !cast<DISubprogram
>(I.second)->isDistinct())) { DebugInfoCheckFailed("function declaration may only have a unique !dbg attachment"
, &F); return; } } while (false)
2681 !cast<DISubprogram>(I.second)->isDistinct(),do { if (!(I.first != LLVMContext::MD_dbg || !cast<DISubprogram
>(I.second)->isDistinct())) { DebugInfoCheckFailed("function declaration may only have a unique !dbg attachment"
, &F); return; } } while (false)
2682 "function declaration may only have a unique !dbg attachment",do { if (!(I.first != LLVMContext::MD_dbg || !cast<DISubprogram
>(I.second)->isDistinct())) { DebugInfoCheckFailed("function declaration may only have a unique !dbg attachment"
, &F); return; } } while (false)
2683 &F)do { if (!(I.first != LLVMContext::MD_dbg || !cast<DISubprogram
>(I.second)->isDistinct())) { DebugInfoCheckFailed("function declaration may only have a unique !dbg attachment"
, &F); return; } } while (false)
;
2684 Check(I.first != LLVMContext::MD_prof,do { if (!(I.first != LLVMContext::MD_prof)) { CheckFailed("function declaration may not have a !prof attachment"
, &F); return; } } while (false)
2685 "function declaration may not have a !prof attachment", &F)do { if (!(I.first != LLVMContext::MD_prof)) { CheckFailed("function declaration may not have a !prof attachment"
, &F); return; } } while (false)
;
2686
2687 // Verify the metadata itself.
2688 visitMDNode(*I.second, AreDebugLocsAllowed::Yes);
2689 }
2690 Check(!F.hasPersonalityFn(),do { if (!(!F.hasPersonalityFn())) { CheckFailed("Function declaration shouldn't have a personality routine"
, &F); return; } } while (false)
36
Assuming the condition is true
37
Taking false branch
2691 "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 (false)
;
2692 } else {
2693 // Verify that this function (which has a body) is not named "llvm.*". It
2694 // is not legal to define intrinsics.
2695 Check(!IsIntrinsic, "llvm intrinsics cannot be defined!", &F)do { if (!(!IsIntrinsic)) { CheckFailed("llvm intrinsics cannot be defined!"
, &F); return; } } while (false)
;
2696
2697 // Check the entry node
2698 const BasicBlock *Entry = &F.getEntryBlock();
2699 Check(pred_empty(Entry),do { if (!(pred_empty(Entry))) { CheckFailed("Entry block to function must not have predecessors!"
, Entry); return; } } while (false)
2700 "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 (false)
;
2701
2702 // The address of the entry block cannot be taken, unless it is dead.
2703 if (Entry->hasAddressTaken()) {
2704 Check(!BlockAddress::lookup(Entry)->isConstantUsed(),do { if (!(!BlockAddress::lookup(Entry)->isConstantUsed())
) { CheckFailed("blockaddress may not be used with the entry block!"
, Entry); return; } } while (false)
2705 "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 (false)
;
2706 }
2707
2708 unsigned NumDebugAttachments = 0, NumProfAttachments = 0,
2709 NumKCFIAttachments = 0;
2710 // Visit metadata attachments.
2711 for (const auto &I : MDs) {
2712 // Verify that the attachment is legal.
2713 auto AllowLocs = AreDebugLocsAllowed::No;
2714 switch (I.first) {
2715 default:
2716 break;
2717 case LLVMContext::MD_dbg: {
2718 ++NumDebugAttachments;
2719 CheckDI(NumDebugAttachments == 1,do { if (!(NumDebugAttachments == 1)) { DebugInfoCheckFailed(
"function must have a single !dbg attachment", &F, I.second
); return; } } while (false)
2720 "function must have a single !dbg attachment", &F, I.second)do { if (!(NumDebugAttachments == 1)) { DebugInfoCheckFailed(
"function must have a single !dbg attachment", &F, I.second
); return; } } while (false)
;
2721 CheckDI(isa<DISubprogram>(I.second),do { if (!(isa<DISubprogram>(I.second))) { DebugInfoCheckFailed
("function !dbg attachment must be a subprogram", &F, I.second
); return; } } while (false)
2722 "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 (false)
;
2723 CheckDI(cast<DISubprogram>(I.second)->isDistinct(),do { if (!(cast<DISubprogram>(I.second)->isDistinct(
))) { DebugInfoCheckFailed("function definition may only have a distinct !dbg attachment"
, &F); return; } } while (false)
2724 "function definition may only have a distinct !dbg attachment",do { if (!(cast<DISubprogram>(I.second)->isDistinct(
))) { DebugInfoCheckFailed("function definition may only have a distinct !dbg attachment"
, &F); return; } } while (false)
2725 &F)do { if (!(cast<DISubprogram>(I.second)->isDistinct(
))) { DebugInfoCheckFailed("function definition may only have a distinct !dbg attachment"
, &F); return; } } while (false)
;
2726
2727 auto *SP = cast<DISubprogram>(I.second);
2728 const Function *&AttachedTo = DISubprogramAttachments[SP];
2729 CheckDI(!AttachedTo || AttachedTo == &F,do { if (!(!AttachedTo || AttachedTo == &F)) { DebugInfoCheckFailed
("DISubprogram attached to more than one function", SP, &
F); return; } } while (false)
2730 "DISubprogram attached to more than one function", SP, &F)do { if (!(!AttachedTo || AttachedTo == &F)) { DebugInfoCheckFailed
("DISubprogram attached to more than one function", SP, &
F); return; } } while (false)
;
2731 AttachedTo = &F;
2732 AllowLocs = AreDebugLocsAllowed::Yes;
2733 break;
2734 }
2735 case LLVMContext::MD_prof:
2736 ++NumProfAttachments;
2737 Check(NumProfAttachments == 1,do { if (!(NumProfAttachments == 1)) { CheckFailed("function must have a single !prof attachment"
, &F, I.second); return; } } while (false)
2738 "function must have a single !prof attachment", &F, I.second)do { if (!(NumProfAttachments == 1)) { CheckFailed("function must have a single !prof attachment"
, &F, I.second); return; } } while (false)
;
2739 break;
2740 case LLVMContext::MD_kcfi_type:
2741 ++NumKCFIAttachments;
2742 Check(NumKCFIAttachments == 1,do { if (!(NumKCFIAttachments == 1)) { CheckFailed("function must have a single !kcfi_type attachment"
, &F, I.second); return; } } while (false)
2743 "function must have a single !kcfi_type attachment", &F,do { if (!(NumKCFIAttachments == 1)) { CheckFailed("function must have a single !kcfi_type attachment"
, &F, I.second); return; } } while (false)
2744 I.second)do { if (!(NumKCFIAttachments == 1)) { CheckFailed("function must have a single !kcfi_type attachment"
, &F, I.second); return; } } while (false)
;
2745 break;
2746 }
2747
2748 // Verify the metadata itself.
2749 visitMDNode(*I.second, AllowLocs);
2750 }
2751 }
2752
2753 // If this function is actually an intrinsic, verify that it is only used in
2754 // direct call/invokes, never having its "address taken".
2755 // Only do this if the module is materialized, otherwise we don't have all the
2756 // uses.
2757 if (F.isIntrinsic() && F.getParent()->isMaterialized()) {
38
Loop condition is false. Exiting loop
39
Assuming the condition is false
2758 const User *U;
2759 if (F.hasAddressTaken(&U, false, true, false,
2760 /*IgnoreARCAttachedCall=*/true))
2761 Check(false, "Invalid user of intrinsic instruction!", U)do { if (!(false)) { CheckFailed("Invalid user of intrinsic instruction!"
, U); return; } } while (false)
;
2762 }
2763
2764 // Check intrinsics' signatures.
2765 switch (F.getIntrinsicID()) {
40
'Default' branch taken. Execution continues on line 2786
2766 case Intrinsic::experimental_gc_get_pointer_base: {
2767 FunctionType *FT = F.getFunctionType();
2768 Check(FT->getNumParams() == 1, "wrong number of parameters", F)do { if (!(FT->getNumParams() == 1)) { CheckFailed("wrong number of parameters"
, F); return; } } while (false)
;
2769 Check(isa<PointerType>(F.getReturnType()),do { if (!(isa<PointerType>(F.getReturnType()))) { CheckFailed
("gc.get.pointer.base must return a pointer", F); return; } }
while (false)
2770 "gc.get.pointer.base must return a pointer", F)do { if (!(isa<PointerType>(F.getReturnType()))) { CheckFailed
("gc.get.pointer.base must return a pointer", F); return; } }
while (false)
;
2771 Check(FT->getParamType(0) == F.getReturnType(),do { if (!(FT->getParamType(0) == F.getReturnType())) { CheckFailed
("gc.get.pointer.base operand and result must be of the same type"
, F); return; } } while (false)
2772 "gc.get.pointer.base operand and result must be of the same type", F)do { if (!(FT->getParamType(0) == F.getReturnType())) { CheckFailed
("gc.get.pointer.base operand and result must be of the same type"
, F); return; } } while (false)
;
2773 break;
2774 }
2775 case Intrinsic::experimental_gc_get_pointer_offset: {
2776 FunctionType *FT = F.getFunctionType();
2777 Check(FT->getNumParams() == 1, "wrong number of parameters", F)do { if (!(FT->getNumParams() == 1)) { CheckFailed("wrong number of parameters"
, F); return; } } while (false)
;
2778 Check(isa<PointerType>(FT->getParamType(0)),do { if (!(isa<PointerType>(FT->getParamType(0)))) {
CheckFailed("gc.get.pointer.offset operand must be a pointer"
, F); return; } } while (false)
2779 "gc.get.pointer.offset operand must be a pointer", F)do { if (!(isa<PointerType>(FT->getParamType(0)))) {
CheckFailed("gc.get.pointer.offset operand must be a pointer"
, F); return; } } while (false)
;
2780 Check(F.getReturnType()->isIntegerTy(),do { if (!(F.getReturnType()->isIntegerTy())) { CheckFailed
("gc.get.pointer.offset must return integer", F); return; } }
while (false)
2781 "gc.get.pointer.offset must return integer", F)do { if (!(F.getReturnType()->isIntegerTy())) { CheckFailed
("gc.get.pointer.offset must return integer", F); return; } }
while (false)
;
2782 break;
2783 }
2784 }
2785
2786 auto *N = F.getSubprogram();
2787 HasDebugInfo = (N != nullptr);
41
Assuming the condition is true
2788 if (!HasDebugInfo
41.1
Field 'HasDebugInfo' is true
41.1
Field 'HasDebugInfo' is true
)
42
Taking false branch
2789 return;
2790
2791 // Check that all !dbg attachments lead to back to N.
2792 //
2793 // FIXME: Check this incrementally while visiting !dbg attachments.
2794 // FIXME: Only check when N is the canonical subprogram for F.
2795 SmallPtrSet<const MDNode *, 32> Seen;
2796 auto VisitDebugLoc = [&](const Instruction &I, const MDNode *Node) {
2797 // Be careful about using DILocation here since we might be dealing with
2798 // broken code (this is the Verifier after all).
2799 const DILocation *DL = dyn_cast_or_null<DILocation>(Node);
44
Assuming 'Node' is a 'CastReturnType'
2800 if (!DL
44.1
'DL' is non-null
44.1
'DL' is non-null
)
45
Taking false branch
2801 return;
2802 if (!Seen.insert(DL).second)
46
Assuming field 'second' is true
47
Taking false branch
2803 return;
2804
2805 Metadata *Parent = DL->getRawScope();
2806 CheckDI(Parent && isa<DILocalScope>(Parent),do { if (!(Parent && isa<DILocalScope>(Parent))
) { DebugInfoCheckFailed("DILocation's scope must be a DILocalScope"
, N, &F, &I, DL, Parent); return; } } while (false)
48
Assuming 'Parent' is non-null
49
Assuming 'Parent' is a 'class llvm::DILocalScope &'
50
Taking false branch
51
Loop condition is false. Exiting loop
2807 "DILocation's scope must be a DILocalScope", N, &F, &I, DL, Parent)do { if (!(Parent && isa<DILocalScope>(Parent))
) { DebugInfoCheckFailed("DILocation's scope must be a DILocalScope"
, N, &F, &I, DL, Parent); return; } } while (false)
;
2808
2809 DILocalScope *Scope = DL->getInlinedAtScope();
52
Calling 'DILocation::getInlinedAtScope'
63
Returning from 'DILocation::getInlinedAtScope'
2810 Check(Scope, "Failed to find DILocalScope", DL)do { if (!(Scope)) { CheckFailed("Failed to find DILocalScope"
, DL); return; } } while (false)
;
64
Assuming 'Scope' is non-null
65
Taking false branch
66
Loop condition is false. Exiting loop
2811
2812 if (!Seen.insert(Scope).second)
67
Assuming field 'second' is true
68
Taking false branch
2813 return;
2814
2815 DISubprogram *SP = Scope->getSubprogram();
69
'SP' initialized here
2816
2817 // Scope and SP could be the same MDNode and we don't want to skip
2818 // validation in that case
2819 if (SP && ((Scope != SP) && !Seen.insert(SP).second))
70
Assuming 'SP' is null
71
Taking false branch
2820 return;
2821
2822 CheckDI(SP->describes(&F),do { if (!(SP->describes(&F))) { DebugInfoCheckFailed(
"!dbg attachment points at wrong subprogram for function", N,
&F, &I, DL, Scope, SP); return; } } while (false)
72
Called C++ object pointer is null
2823 "!dbg attachment points at wrong subprogram for function", N, &F,do { if (!(SP->describes(&F))) { DebugInfoCheckFailed(
"!dbg attachment points at wrong subprogram for function", N,
&F, &I, DL, Scope, SP); return; } } while (false)
2824 &I, DL, Scope, SP)do { if (!(SP->describes(&F))) { DebugInfoCheckFailed(
"!dbg attachment points at wrong subprogram for function", N,
&F, &I, DL, Scope, SP); return; } } while (false)
;
2825 };
2826 for (auto &BB : F)
2827 for (auto &I : BB) {
2828 VisitDebugLoc(I, I.getDebugLoc().getAsMDNode());
43
Calling 'operator()'
2829 // The llvm.loop annotations also contain two DILocations.
2830 if (auto MD = I.getMetadata(LLVMContext::MD_loop))
2831 for (unsigned i = 1; i < MD->getNumOperands(); ++i)
2832 VisitDebugLoc(I, dyn_cast_or_null<MDNode>(MD->getOperand(i)));
2833 if (BrokenDebugInfo)
2834 return;
2835 }
2836}
2837
2838// verifyBasicBlock - Verify that a basic block is well formed...
2839//
2840void Verifier::visitBasicBlock(BasicBlock &BB) {
2841 InstsInThisBlock.clear();
2842
2843 // Ensure that basic blocks have terminators!
2844 Check(BB.getTerminator(), "Basic Block does not have terminator!", &BB)do { if (!(BB.getTerminator())) { CheckFailed("Basic Block does not have terminator!"
, &BB); return; } } while (false)
;
2845
2846 // Check constraints that this basic block imposes on all of the PHI nodes in
2847 // it.
2848 if (isa<PHINode>(BB.front())) {
2849 SmallVector<BasicBlock *, 8> Preds(predecessors(&BB));
2850 SmallVector<std::pair<BasicBlock*, Value*>, 8> Values;
2851 llvm::sort(Preds);
2852 for (const PHINode &PN : BB.phis()) {
2853 Check(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 (false)
2854 "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 (false)
2855 "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 (false)
2856 &PN)do { if (!(PN.getNumIncomingValues() == Preds.size())) { CheckFailed
("PHINode should have one entry for each predecessor of its "
"parent basic block!", &PN); return; } } while (false)
;
2857
2858 // Get and sort all incoming values in the PHI node...
2859 Values.clear();
2860 Values.reserve(PN.getNumIncomingValues());
2861 for (unsigned i = 0, e = PN.getNumIncomingValues(); i != e; ++i)
2862 Values.push_back(
2863 std::make_pair(PN.getIncomingBlock(i), PN.getIncomingValue(i)));
2864 llvm::sort(Values);
2865
2866 for (unsigned i = 0, e = Values.size(); i != e; ++i) {
2867 // Check to make sure that if there is more than one entry for a
2868 // particular basic block in this PHI node, that the incoming values are
2869 // all identical.
2870 //
2871 Check(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 (false)
2872 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 (false)
2873 "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 (false)
2874 "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 (false)
2875 &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 (false)
;
2876
2877 // Check to make sure that the predecessors and PHI node entries are
2878 // matched up.
2879 Check(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 (false
)
2880 "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 (false
)
2881 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 (false
)
;
2882 }
2883 }
2884 }
2885
2886 // Check that all instructions have their parent pointers set up correctly.
2887 for (auto &I : BB)
2888 {
2889 Check(I.getParent() == &BB, "Instruction has bogus parent pointer!")do { if (!(I.getParent() == &BB)) { CheckFailed("Instruction has bogus parent pointer!"
); return; } } while (false)
;
2890 }
2891}
2892
2893void Verifier::visitTerminator(Instruction &I) {
2894 // Ensure that terminators only exist at the end of the basic block.
2895 Check(&I == I.getParent()->getTerminator(),do { if (!(&I == I.getParent()->getTerminator())) { CheckFailed
("Terminator found in the middle of a basic block!", I.getParent
()); return; } } while (false)
2896 "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 (false)
;
2897 visitInstruction(I);
2898}
2899
2900void Verifier::visitBranchInst(BranchInst &BI) {
2901 if (BI.isConditional()) {
2902 Check(BI.getCondition()->getType()->isIntegerTy(1),do { if (!(BI.getCondition()->getType()->isIntegerTy(1)
)) { CheckFailed("Branch condition is not 'i1' type!", &BI
, BI.getCondition()); return; } } while (false)
2903 "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 (false)
;
2904 }
2905 visitTerminator(BI);
2906}
2907
2908void Verifier::visitReturnInst(ReturnInst &RI) {
2909 Function *F = RI.getParent()->getParent();
2910 unsigned N = RI.getNumOperands();
2911 if (F->getReturnType()->isVoidTy())
2912 Check(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 (false)
2913 "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 (false)
2914 "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 (false)
2915 &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 (false)
;
2916 else
2917 Check(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 (false)
2918 "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 (false)
2919 "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 (false)
2920 &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 (false)
;
2921
2922 // Check to make sure that the return value has necessary properties for
2923 // terminators...
2924 visitTerminator(RI);
2925}
2926
2927void Verifier::visitSwitchInst(SwitchInst &SI) {
2928 Check(SI.getType()->isVoidTy(), "Switch must have void result type!", &SI)do { if (!(SI.getType()->isVoidTy())) { CheckFailed("Switch must have void result type!"
, &SI); return; } } while (false)
;
2929 // Check to make sure that all of the constants in the switch instruction
2930 // have the same type as the switched-on value.
2931 Type *SwitchTy = SI.getCondition()->getType();
2932 SmallPtrSet<ConstantInt*, 32> Constants;
2933 for (auto &Case : SI.cases()) {
2934 Check(isa<ConstantInt>(SI.getOperand(Case.getCaseIndex() * 2 + 2)),do { if (!(isa<ConstantInt>(SI.getOperand(Case.getCaseIndex
() * 2 + 2)))) { CheckFailed("Case value is not a constant integer."
, &SI); return; } } while (false)
2935 "Case value is not a constant integer.", &SI)do { if (!(isa<ConstantInt>(SI.getOperand(Case.getCaseIndex
() * 2 + 2)))) { CheckFailed("Case value is not a constant integer."
, &SI); return; } } while (false)
;
2936 Check(Case.getCaseValue()->getType() == SwitchTy,do { if (!(Case.getCaseValue()->getType() == SwitchTy)) { CheckFailed
("Switch constants must all be same type as switch value!", &
SI); return; } } while (false)
2937 "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 (false)
;
2938 Check(Constants.insert(Case.getCaseValue()).second,do { if (!(Constants.insert(Case.getCaseValue()).second)) { CheckFailed
("Duplicate integer as switch case", &SI, Case.getCaseValue
()); return; } } while (false)
2939 "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 (false)
;
2940 }
2941
2942 visitTerminator(SI);
2943}
2944
2945void Verifier::visitIndirectBrInst(IndirectBrInst &BI) {
2946 Check(BI.getAddress()->getType()->isPointerTy(),do { if (!(BI.getAddress()->getType()->isPointerTy())) {
CheckFailed("Indirectbr operand must have pointer type!", &
BI); return; } } while (false)
2947 "Indirectbr operand must have pointer type!", &BI)do { if (!(BI.getAddress()->getType()->isPointerTy())) {
CheckFailed("Indirectbr operand must have pointer type!", &
BI); return; } } while (false)
;
2948 for (unsigned i = 0, e = BI.getNumDestinations(); i != e; ++i)
2949 Check(BI.getDestination(i)->getType()->isLabelTy(),do { if (!(BI.getDestination(i)->getType()->isLabelTy()
)) { CheckFailed("Indirectbr destinations must all have pointer type!"
, &BI); return; } } while (false)
2950 "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 (false)
;
2951
2952 visitTerminator(BI);
2953}
2954
2955void Verifier::visitCallBrInst(CallBrInst &CBI) {
2956 Check(CBI.isInlineAsm(), "Callbr is currently only used for asm-goto!", &CBI)do { if (!(CBI.isInlineAsm())) { CheckFailed("Callbr is currently only used for asm-goto!"
, &CBI); return; } } while (false)
;
2957 const InlineAsm *IA = cast<InlineAsm>(CBI.getCalledOperand());
2958 Check(!IA->canThrow(), "Unwinding from Callbr is not allowed")do { if (!(!IA->canThrow())) { CheckFailed("Unwinding from Callbr is not allowed"
); return; } } while (false)
;
2959
2960 verifyInlineAsmCall(CBI);
2961 visitTerminator(CBI);
2962}
2963
2964void Verifier::visitSelectInst(SelectInst &SI) {
2965 Check(!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 (false)
2966 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 (false)
2967 "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 (false)
;
2968
2969 Check(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 (false)
2970 "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 (false)
;
2971 visitInstruction(SI);
2972}
2973
2974/// visitUserOp1 - User defined operators shouldn't live beyond the lifetime of
2975/// a pass, if any exist, it's an error.
2976///
2977void Verifier::visitUserOp1(Instruction &I) {
2978 Check(false, "User-defined operators should not live outside of a pass!", &I)do { if (!(false)) { CheckFailed("User-defined operators should not live outside of a pass!"
, &I); return; } } while (false)
;
2979}
2980
2981void Verifier::visitTruncInst(TruncInst &I) {
2982 // Get the source and destination types
2983 Type *SrcTy = I.getOperand(0)->getType();
2984 Type *DestTy = I.getType();
2985
2986 // Get the size of the types in bits, we'll need this later
2987 unsigned SrcBitSize = SrcTy->getScalarSizeInBits();
2988 unsigned DestBitSize = DestTy->getScalarSizeInBits();
2989
2990 Check(SrcTy->isIntOrIntVectorTy(), "Trunc only operates on integer", &I)do { if (!(SrcTy->isIntOrIntVectorTy())) { CheckFailed("Trunc only operates on integer"
, &I); return; } } while (false)
;
2991 Check(DestTy->isIntOrIntVectorTy(), "Trunc only produces integer", &I)do { if (!(DestTy->isIntOrIntVectorTy())) { CheckFailed("Trunc only produces integer"
, &I); return; } } while (false)
;
2992 Check(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 (false)
2993 "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 (false)
;
2994 Check(SrcBitSize > DestBitSize, "DestTy too big for Trunc", &I)do { if (!(SrcBitSize > DestBitSize)) { CheckFailed("DestTy too big for Trunc"
, &I); return; } } while (false)
;
2995
2996 visitInstruction(I);
2997}
2998
2999void Verifier::visitZExtInst(ZExtInst &I) {
3000 // Get the source and destination types
3001 Type *SrcTy = I.getOperand(0)->getType();
3002 Type *DestTy = I.getType();
3003
3004 // Get the size of the types in bits, we'll need this later
3005 Check(SrcTy->isIntOrIntVectorTy(), "ZExt only operates on integer", &I)do { if (!(SrcTy->isIntOrIntVectorTy())) { CheckFailed("ZExt only operates on integer"
, &I); return; } } while (false)
;
3006 Check(DestTy->isIntOrIntVectorTy(), "ZExt only produces an integer", &I)do { if (!(DestTy->isIntOrIntVectorTy())) { CheckFailed("ZExt only produces an integer"
, &I); return; } } while (false)
;
3007 Check(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 (false)
3008 "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 (false)
;
3009 unsigned SrcBitSize = SrcTy->getScalarSizeInBits();
3010 unsigned DestBitSize = DestTy->getScalarSizeInBits();
3011
3012 Check(SrcBitSize < DestBitSize, "Type too small for ZExt", &I)do { if (!(SrcBitSize < DestBitSize)) { CheckFailed("Type too small for ZExt"
, &I); return; } } while (false)
;
3013
3014 visitInstruction(I);
3015}
3016
3017void Verifier::visitSExtInst(SExtInst &I) {
3018 // Get the source and destination types
3019 Type *SrcTy = I.getOperand(0)->getType();
3020 Type *DestTy = I.getType();
3021
3022 // Get the size of the types in bits, we'll need this later
3023 unsigned SrcBitSize = SrcTy->getScalarSizeInBits();
3024 unsigned DestBitSize = DestTy->getScalarSizeInBits();
3025
3026 Check(SrcTy->isIntOrIntVectorTy(), "SExt only operates on integer", &I)do { if (!(SrcTy->isIntOrIntVectorTy())) { CheckFailed("SExt only operates on integer"
, &I); return; } } while (false)
;
3027 Check(DestTy->isIntOrIntVectorTy(), "SExt only produces an integer", &I)do { if (!(DestTy->isIntOrIntVectorTy())) { CheckFailed("SExt only produces an integer"
, &I); return; } } while (false)
;
3028 Check(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 (false)
3029 "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 (false)
;
3030 Check(SrcBitSize < DestBitSize, "Type too small for SExt", &I)do { if (!(SrcBitSize < DestBitSize)) { CheckFailed("Type too small for SExt"
, &I); return; } } while (false)
;
3031
3032 visitInstruction(I);
3033}
3034
3035void Verifier::visitFPTruncInst(FPTruncInst &I) {
3036 // Get the source and destination types
3037 Type *SrcTy = I.getOperand(0)->getType();
3038 Type *DestTy = I.getType();
3039 // Get the size of the types in bits, we'll need this later
3040 unsigned SrcBitSize = SrcTy->getScalarSizeInBits();
3041 unsigned DestBitSize = DestTy->getScalarSizeInBits();
3042
3043 Check(SrcTy->isFPOrFPVectorTy(), "FPTrunc only operates on FP", &I)do { if (!(SrcTy->isFPOrFPVectorTy())) { CheckFailed("FPTrunc only operates on FP"
, &I); return; } } while (false)
;
3044 Check(DestTy->isFPOrFPVectorTy(), "FPTrunc only produces an FP", &I)do { if (!(DestTy->isFPOrFPVectorTy())) { CheckFailed("FPTrunc only produces an FP"
, &I); return; } } while (false)
;
3045 Check(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 (false)
3046 "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 (false)
;
3047 Check(SrcBitSize > DestBitSize, "DestTy too big for FPTrunc", &I)do { if (!(SrcBitSize > DestBitSize)) { CheckFailed("DestTy too big for FPTrunc"
, &I); return; } } while (false)
;
3048
3049 visitInstruction(I);
3050}
3051
3052void Verifier::visitFPExtInst(FPExtInst &I) {
3053 // Get the source and destination types
3054 Type *SrcTy = I.getOperand(0)->getType();
3055 Type *DestTy = I.getType();
3056
3057 // Get the size of the types in bits, we'll need this later
3058 unsigned SrcBitSize = SrcTy->getScalarSizeInBits();
3059 unsigned DestBitSize = DestTy->getScalarSizeInBits();
3060
3061 Check(SrcTy->isFPOrFPVectorTy(), "FPExt only operates on FP", &I)do { if (!(SrcTy->isFPOrFPVectorTy())) { CheckFailed("FPExt only operates on FP"
, &I); return; } } while (false)
;
3062 Check(DestTy->isFPOrFPVectorTy(), "FPExt only produces an FP", &I)do { if (!(DestTy->isFPOrFPVectorTy())) { CheckFailed("FPExt only produces an FP"
, &I); return; } } while (false)
;
3063 Check(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 (false)
3064 "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 (false)
;
3065 Check(SrcBitSize < DestBitSize, "DestTy too small for FPExt", &I)do { if (!(SrcBitSize < DestBitSize)) { CheckFailed("DestTy too small for FPExt"
, &I); return; } } while (false)
;
3066
3067 visitInstruction(I);
3068}
3069
3070void Verifier::visitUIToFPInst(UIToFPInst &I) {
3071 // Get the source and destination types
3072 Type *SrcTy = I.getOperand(0)->getType();
3073 Type *DestTy = I.getType();
3074
3075 bool SrcVec = SrcTy->isVectorTy();
3076 bool DstVec = DestTy->isVectorTy();
3077
3078 Check(SrcVec == DstVec,do { if (!(SrcVec == DstVec)) { CheckFailed("UIToFP source and dest must both be vector or scalar"
, &I); return; } } while (false)
3079 "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 (false)
;
3080 Check(SrcTy->isIntOrIntVectorTy(),do { if (!(SrcTy->isIntOrIntVectorTy())) { CheckFailed("UIToFP source must be integer or integer vector"
, &I); return; } } while (false)
3081 "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 (false)
;
3082 Check(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 (false)
3083 &I)do { if (!(DestTy->isFPOrFPVectorTy())) { CheckFailed("UIToFP result must be FP or FP vector"
, &I); return; } } while (false)
;
3084
3085 if (SrcVec && DstVec)
3086 Check(cast<VectorType>(SrcTy)->getElementCount() ==do { if (!(cast<VectorType>(SrcTy)->getElementCount(
) == cast<VectorType>(DestTy)->getElementCount())) {
CheckFailed("UIToFP source and dest vector length mismatch",
&I); return; } } while (false)
3087 cast<VectorType>(DestTy)->getElementCount(),do { if (!(cast<VectorType>(SrcTy)->getElementCount(
) == cast<VectorType>(DestTy)->getElementCount())) {
CheckFailed("UIToFP source and dest vector length mismatch",
&I); return; } } while (false)
3088 "UIToFP source and dest vector length mismatch", &I)do { if (!(cast<VectorType>(SrcTy)->getElementCount(
) == cast<VectorType>(DestTy)->getElementCount())) {
CheckFailed("UIToFP source and dest vector length mismatch",
&I); return; } } while (false)
;
3089
3090 visitInstruction(I);
3091}
3092
3093void Verifier::visitSIToFPInst(SIToFPInst &I) {
3094 // Get the source and destination types
3095 Type *SrcTy = I.getOperand(0)->getType();
3096 Type *DestTy = I.getType();
3097
3098 bool SrcVec = SrcTy->isVectorTy();
3099 bool DstVec = DestTy->isVectorTy();
3100
3101 Check(SrcVec == DstVec,do { if (!(SrcVec == DstVec)) { CheckFailed("SIToFP source and dest must both be vector or scalar"
, &I); return; } } while (false)
3102 "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 (false)
;
3103 Check(SrcTy->isIntOrIntVectorTy(),do { if (!(SrcTy->isIntOrIntVectorTy())) { CheckFailed("SIToFP source must be integer or integer vector"
, &I); return; } } while (false)
3104 "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 (false)
;
3105 Check(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 (false)
3106 &I)do { if (!(DestTy->isFPOrFPVectorTy())) { CheckFailed("SIToFP result must be FP or FP vector"
, &I); return; } } while (false)
;
3107
3108 if (SrcVec && DstVec)
3109 Check(cast<VectorType>(SrcTy)->getElementCount() ==do { if (!(cast<VectorType>(SrcTy)->getElementCount(
) == cast<VectorType>(DestTy)->getElementCount())) {
CheckFailed("SIToFP source and dest vector length mismatch",
&I); return; } } while (false)
3110 cast<VectorType>(DestTy)->getElementCount(),do { if (!(cast<VectorType>(SrcTy)->getElementCount(
) == cast<VectorType>(DestTy)->getElementCount())) {
CheckFailed("SIToFP source and dest vector length mismatch",
&I); return; } } while (false)
3111 "SIToFP source and dest vector length mismatch", &I)do { if (!(cast<VectorType>(SrcTy)->getElementCount(
) == cast<VectorType>(DestTy)->getElementCount())) {
CheckFailed("SIToFP source and dest vector length mismatch",
&I); return; } } while (false)
;
3112
3113 visitInstruction(I);
3114}
3115
3116void Verifier::visitFPToUIInst(FPToUIInst &I) {
3117 // Get the source and destination types
3118 Type *SrcTy = I.getOperand(0)->getType();
3119 Type *DestTy = I.getType();
3120
3121 bool SrcVec = SrcTy->isVectorTy();
3122 bool DstVec = DestTy->isVectorTy();
3123
3124 Check(SrcVec == DstVec,do { if (!(SrcVec == DstVec)) { CheckFailed("FPToUI source and dest must both be vector or scalar"
, &I); return; } } while (false)
3125 "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 (false)
;
3126 Check(SrcTy->isFPOrFPVectorTy(), "FPToUI source must be FP or FP vector", &I)do { if (!(SrcTy->isFPOrFPVectorTy())) { CheckFailed("FPToUI source must be FP or FP vector"
, &I); return; } } while (false)
;
3127 Check(DestTy->isIntOrIntVectorTy(),do { if (!(DestTy->isIntOrIntVectorTy())) { CheckFailed("FPToUI result must be integer or integer vector"
, &I); return; } } while (false)
3128 "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 (false)
;
3129
3130 if (SrcVec && DstVec)
3131 Check(cast<VectorType>(SrcTy)->getElementCount() ==do { if (!(cast<VectorType>(SrcTy)->getElementCount(
) == cast<VectorType>(DestTy)->getElementCount())) {
CheckFailed("FPToUI source and dest vector length mismatch",
&I); return; } } while (false)
3132 cast<VectorType>(DestTy)->getElementCount(),do { if (!(cast<VectorType>(SrcTy)->getElementCount(
) == cast<VectorType>(DestTy)->getElementCount())) {
CheckFailed("FPToUI source and dest vector length mismatch",
&I); return; } } while (false)
3133 "FPToUI source and dest vector length mismatch", &I)do { if (!(cast<VectorType>(SrcTy)->getElementCount(
) == cast<VectorType>(DestTy)->getElementCount())) {
CheckFailed("FPToUI source and dest vector length mismatch",
&I); return; } } while (false)
;
3134
3135 visitInstruction(I);
3136}
3137
3138void Verifier::visitFPToSIInst(FPToSIInst &I) {
3139 // Get the source and destination types
3140 Type *SrcTy = I.getOperand(0)->getType();
3141 Type *DestTy = I.getType();
3142
3143 bool SrcVec = SrcTy->isVectorTy();
3144 bool DstVec = DestTy->isVectorTy();
3145
3146 Check(SrcVec == DstVec,do { if (!(SrcVec == DstVec)) { CheckFailed("FPToSI source and dest must both be vector or scalar"
, &I); return; } } while (false)
3147 "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 (false)
;
3148 Check(SrcTy->isFPOrFPVectorTy(), "FPToSI source must be FP or FP vector", &I)do { if (!(SrcTy->isFPOrFPVectorTy())) { CheckFailed("FPToSI source must be FP or FP vector"
, &I); return; } } while (false)
;
3149 Check(DestTy->isIntOrIntVectorTy(),do { if (!(DestTy->isIntOrIntVectorTy())) { CheckFailed("FPToSI result must be integer or integer vector"
, &I); return; } } while (false)
3150 "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 (false)
;
3151
3152 if (SrcVec && DstVec)
3153 Check(cast<VectorType>(SrcTy)->getElementCount() ==do { if (!(cast<VectorType>(SrcTy)->getElementCount(
) == cast<VectorType>(DestTy)->getElementCount())) {
CheckFailed("FPToSI source and dest vector length mismatch",
&I); return; } } while (false)
3154 cast<VectorType>(DestTy)->getElementCount(),do { if (!(cast<VectorType>(SrcTy)->getElementCount(
) == cast<VectorType>(DestTy)->getElementCount())) {
CheckFailed("FPToSI source and dest vector length mismatch",
&I); return; } } while (false)
3155 "FPToSI source and dest vector length mismatch", &I)do { if (!(cast<VectorType>(SrcTy)->getElementCount(
) == cast<VectorType>(DestTy)->getElementCount())) {
CheckFailed("FPToSI source and dest vector length mismatch",
&I); return; } } while (false)
;
3156
3157 visitInstruction(I);
3158}
3159
3160void Verifier::visitPtrToIntInst(PtrToIntInst &I) {
3161 // Get the source and destination types
3162 Type *SrcTy = I.getOperand(0)->getType();
3163 Type *DestTy = I.getType();
3164
3165 Check(SrcTy->isPtrOrPtrVectorTy(), "PtrToInt source must be pointer", &I)do { if (!(SrcTy->isPtrOrPtrVectorTy())) { CheckFailed("PtrToInt source must be pointer"
, &I); return; } } while (false)
;
3166
3167 Check(DestTy->isIntOrIntVectorTy(), "PtrToInt result must be integral", &I)do { if (!(DestTy->isIntOrIntVectorTy())) { CheckFailed("PtrToInt result must be integral"
, &I); return; } } while (false)
;
3168 Check(SrcTy->isVectorTy() == DestTy->isVectorTy(), "PtrToInt type mismatch",do { if (!(SrcTy->isVectorTy() == DestTy->isVectorTy())
) { CheckFailed("PtrToInt type mismatch", &I); return; } }
while (false)
3169 &I)do { if (!(SrcTy->isVectorTy() == DestTy->isVectorTy())
) { CheckFailed("PtrToInt type mismatch", &I); return; } }
while (false)
;
3170
3171 if (SrcTy->isVectorTy()) {
3172 auto *VSrc = cast<VectorType>(SrcTy);
3173 auto *VDest = cast<VectorType>(DestTy);
3174 Check(VSrc->getElementCount() == VDest->getElementCount(),do { if (!(VSrc->getElementCount() == VDest->getElementCount
())) { CheckFailed("PtrToInt Vector width mismatch", &I);
return; } } while (false)
3175 "PtrToInt Vector width mismatch", &I)do { if (!(VSrc->getElementCount() == VDest->getElementCount
())) { CheckFailed("PtrToInt Vector width mismatch", &I);
return; } } while (false)
;
3176 }
3177
3178 visitInstruction(I);
3179}
3180
3181void Verifier::visitIntToPtrInst(IntToPtrInst &I) {
3182 // Get the source and destination types
3183 Type *SrcTy = I.getOperand(0)->getType();
3184 Type *DestTy = I.getType();
3185
3186 Check(SrcTy->isIntOrIntVectorTy(), "IntToPtr source must be an integral", &I)do { if (!(SrcTy->isIntOrIntVectorTy())) { CheckFailed("IntToPtr source must be an integral"
, &I); return; } } while (false)
;
3187 Check(DestTy->isPtrOrPtrVectorTy(), "IntToPtr result must be a pointer", &I)do { if (!(DestTy->isPtrOrPtrVectorTy())) { CheckFailed("IntToPtr result must be a pointer"
, &I); return; } } while (false)
;
3188
3189 Check(SrcTy->isVectorTy() == DestTy->isVectorTy(), "IntToPtr type mismatch",do { if (!(SrcTy->isVectorTy() == DestTy->isVectorTy())
) { CheckFailed("IntToPtr type mismatch", &I); return; } }
while (false)
3190 &I)do { if (!(SrcTy->isVectorTy() == DestTy->isVectorTy())
) { CheckFailed("IntToPtr type mismatch", &I); return; } }
while (false)
;
3191 if (SrcTy->isVectorTy()) {
3192 auto *VSrc = cast<VectorType>(SrcTy);
3193 auto *VDest = cast<VectorType>(DestTy);
3194 Check(VSrc->getElementCount() == VDest->getElementCount(),do { if (!(VSrc->getElementCount() == VDest->getElementCount
())) { CheckFailed("IntToPtr Vector width mismatch", &I);
return; } } while (false)
3195 "IntToPtr Vector width mismatch", &I)do { if (!(VSrc->getElementCount() == VDest->getElementCount
())) { CheckFailed("IntToPtr Vector width mismatch", &I);
return; } } while (false)
;
3196 }
3197 visitInstruction(I);
3198}
3199
3200void Verifier::visitBitCastInst(BitCastInst &I) {
3201 Check(do { if (!(CastInst::castIsValid(Instruction::BitCast, I.getOperand
(0), I.getType()))) { CheckFailed("Invalid bitcast", &I);
return; } } while (false)
3202 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 (false)
3203 "Invalid bitcast", &I)do { if (!(CastInst::castIsValid(Instruction::BitCast, I.getOperand
(0), I.getType()))) { CheckFailed("Invalid bitcast", &I);
return; } } while (false)
;
3204 visitInstruction(I);
3205}
3206
3207void Verifier::visitAddrSpaceCastInst(AddrSpaceCastInst &I) {
3208 Type *SrcTy = I.getOperand(0)->getType();
3209 Type *DestTy = I.getType();
3210
3211 Check(SrcTy->isPtrOrPtrVectorTy(), "AddrSpaceCast source must be a pointer",do { if (!(SrcTy->isPtrOrPtrVectorTy())) { CheckFailed("AddrSpaceCast source must be a pointer"
, &I); return; } } while (false)
3212 &I)do { if (!(SrcTy->isPtrOrPtrVectorTy())) { CheckFailed("AddrSpaceCast source must be a pointer"
, &I); return; } } while (false)
;
3213 Check(DestTy->isPtrOrPtrVectorTy(), "AddrSpaceCast result must be a pointer",do { if (!(DestTy->isPtrOrPtrVectorTy())) { CheckFailed("AddrSpaceCast result must be a pointer"
, &I); return; } } while (false)
3214 &I)do { if (!(DestTy->isPtrOrPtrVectorTy())) { CheckFailed("AddrSpaceCast result must be a pointer"
, &I); return; } } while (false)
;
3215 Check(SrcTy->getPointerAddressSpace() != DestTy->getPointerAddressSpace(),do { if (!(SrcTy->getPointerAddressSpace() != DestTy->getPointerAddressSpace
())) { CheckFailed("AddrSpaceCast must be between different address spaces"
, &I); return; } } while (false)
3216 "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 (false)
;
3217 if (auto *SrcVTy = dyn_cast<VectorType>(SrcTy))
3218 Check(SrcVTy->getElementCount() ==do { if (!(SrcVTy->getElementCount() == cast<VectorType
>(DestTy)->getElementCount())) { CheckFailed("AddrSpaceCast vector pointer number of elements mismatch"
, &I); return; } } while (false)
3219 cast<VectorType>(DestTy)->getElementCount(),do { if (!(SrcVTy->getElementCount() == cast<VectorType
>(DestTy)->getElementCount())) { CheckFailed("AddrSpaceCast vector pointer number of elements mismatch"
, &I); return; } } while (false)
3220 "AddrSpaceCast vector pointer number of elements mismatch", &I)do { if (!(SrcVTy->getElementCount() == cast<VectorType
>(DestTy)->getElementCount())) { CheckFailed("AddrSpaceCast vector pointer number of elements mismatch"
, &I); return; } } while (false)
;
3221 visitInstruction(I);
3222}
3223
3224/// visitPHINode - Ensure that a PHI node is well formed.
3225///
3226void Verifier::visitPHINode(PHINode &PN) {
3227 // Ensure that the PHI nodes are all grouped together at the top of the block.
3228 // This can be tested by checking whether the instruction before this is
3229 // either nonexistent (because this is begin()) or is a PHI node. If not,
3230 // then there is some other instruction before a PHI.
3231 Check(&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 (false)
3232 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 (false)
3233 "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 (false)
;
3234
3235 // Check that a PHI doesn't yield a Token.
3236 Check(!PN.getType()->isTokenTy(), "PHI nodes cannot have token type!")do { if (!(!PN.getType()->isTokenTy())) { CheckFailed("PHI nodes cannot have token type!"
); return; } } while (false)
;
3237
3238 // Check that all of the values of the PHI node have the same type as the
3239 // result, and that the incoming blocks are really basic blocks.
3240 for (Value *IncValue : PN.incoming_values()) {
3241 Check(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 (false)
3242 "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 (false)
;
3243 }
3244
3245 // All other PHI node constraints are checked in the visitBasicBlock method.
3246
3247 visitInstruction(PN);
3248}
3249
3250void Verifier::visitCallBase(CallBase &Call) {
3251 Check(Call.getCalledOperand()->getType()->isPointerTy(),do { if (!(Call.getCalledOperand()->getType()->isPointerTy
())) { CheckFailed("Called function must be a pointer!", Call
); return; } } while (false)
3252 "Called function must be a pointer!", Call)do { if (!(Call.getCalledOperand()->getType()->isPointerTy
())) { CheckFailed("Called function must be a pointer!", Call
); return; } } while (false)
;
3253 PointerType *FPTy = cast<PointerType>(Call.getCalledOperand()->getType());
3254
3255 Check(FPTy->isOpaqueOrPointeeTypeMatches(Call.getFunctionType()),do { if (!(FPTy->isOpaqueOrPointeeTypeMatches(Call.getFunctionType
()))) { CheckFailed("Called function is not the same type as the call!"
, Call); return; } } while (false)
3256 "Called function is not the same type as the call!", Call)do { if (!(FPTy->isOpaqueOrPointeeTypeMatches(Call.getFunctionType
()))) { CheckFailed("Called function is not the same type as the call!"
, Call); return; } } while (false)
;
3257
3258 FunctionType *FTy = Call.getFunctionType();
3259
3260 // Verify that the correct number of arguments are being passed
3261 if (FTy->isVarArg())
3262 Check(Call.arg_size() >= FTy->getNumParams(),do { if (!(Call.arg_size() >= FTy->getNumParams())) { CheckFailed
("Called function requires more parameters than were provided!"
, Call); return; } } while (false)
3263 "Called function requires more parameters than were provided!", Call)do { if (!(Call.arg_size() >= FTy->getNumParams())) { CheckFailed
("Called function requires more parameters than were provided!"
, Call); return; } } while (false)
;
3264 else
3265 Check(Call.arg_size() == FTy->getNumParams(),do { if (!(Call.arg_size() == FTy->getNumParams())) { CheckFailed
("Incorrect number of arguments passed to called function!", Call
); return; } } while (false)
3266 "Incorrect number of arguments passed to called function!", Call)do { if (!(Call.arg_size() == FTy->getNumParams())) { CheckFailed
("Incorrect number of arguments passed to called function!", Call
); return; } } while (false)
;
3267
3268 // Verify that all arguments to the call match the function type.
3269 for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)
3270 Check(Call.getArgOperand(i)->getType() == FTy->getParamType(i),do { if (!(Call.getArgOperand(i)->getType() == FTy->getParamType
(i))) { CheckFailed("Call parameter type does not match function signature!"
, Call.getArgOperand(i), FTy->getParamType(i), Call); return
; } } while (false)
3271 "Call parameter type does not match function signature!",do { if (!(Call.getArgOperand(i)->getType() == FTy->getParamType
(i))) { CheckFailed("Call parameter type does not match function signature!"
, Call.getArgOperand(i), FTy->getParamType(i), Call); return
; } } while (false)
3272 Call.getArgOperand(i), FTy->getParamType(i), Call)do { if (!(Call.getArgOperand(i)->getType() == FTy->getParamType
(i))) { CheckFailed("Call parameter type does not match function signature!"
, Call.getArgOperand(i), FTy->getParamType(i), Call); return
; } } while (false)
;
3273
3274 AttributeList Attrs = Call.getAttributes();
3275
3276 Check(verifyAttributeCount(Attrs, Call.arg_size()),do { if (!(verifyAttributeCount(Attrs, Call.arg_size()))) { CheckFailed
("Attribute after last parameter!", Call); return; } } while (
false)
3277 "Attribute after last parameter!", Call)do { if (!(verifyAttributeCount(Attrs, Call.arg_size()))) { CheckFailed
("Attribute after last parameter!", Call); return; } } while (
false)
;
3278
3279 Function *Callee =
3280 dyn_cast<Function>(Call.getCalledOperand()->stripPointerCasts());
3281 bool IsIntrinsic = Callee && Callee->isIntrinsic();
3282 if (IsIntrinsic)
3283 Check(Callee->getValueType() == FTy,do { if (!(Callee->getValueType() == FTy)) { CheckFailed("Intrinsic called with incompatible signature"
, Call); return; } } while (false)
3284 "Intrinsic called with incompatible signature", Call)do { if (!(Callee->getValueType() == FTy)) { CheckFailed("Intrinsic called with incompatible signature"
, Call); return; } } while (false)
;
3285
3286 auto VerifyTypeAlign = [&](Type *Ty, const Twine &Message) {
3287 if (!Ty->isSized())
3288 return;
3289 Align ABIAlign = DL.getABITypeAlign(Ty);
3290 Align MaxAlign(ParamMaxAlignment);
3291 Check(ABIAlign <= MaxAlign,do { if (!(ABIAlign <= MaxAlign)) { CheckFailed("Incorrect alignment of "
+ Message + " to called function!", Call); return; } } while
(false)
3292 "Incorrect alignment of " + Message + " to called function!", Call)do { if (!(ABIAlign <= MaxAlign)) { CheckFailed("Incorrect alignment of "
+ Message + " to called function!", Call); return; } } while
(false)
;
3293 };
3294
3295 if (!IsIntrinsic) {
3296 VerifyTypeAlign(FTy->getReturnType(), "return type");
3297 for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i) {
3298 Type *Ty = FTy->getParamType(i);
3299 VerifyTypeAlign(Ty, "argument passed");
3300 }
3301 }
3302
3303 if (Attrs.hasFnAttr(Attribute::Speculatable)) {
3304 // Don't allow speculatable on call sites, unless the underlying function
3305 // declaration is also speculatable.
3306 Check(Callee && Callee->isSpeculatable(),do { if (!(Callee && Callee->isSpeculatable())) { CheckFailed
("speculatable attribute may not apply to call sites", Call);
return; } } while (false)
3307 "speculatable attribute may not apply to call sites", Call)do { if (!(Callee && Callee->isSpeculatable())) { CheckFailed
("speculatable attribute may not apply to call sites", Call);
return; } } while (false)
;
3308 }
3309
3310 if (Attrs.hasFnAttr(Attribute::Preallocated)) {
3311 Check(Call.getCalledFunction()->getIntrinsicID() ==do { if (!(Call.getCalledFunction()->getIntrinsicID() == Intrinsic
::call_preallocated_arg)) { CheckFailed("preallocated as a call site attribute can only be on "
"llvm.call.preallocated.arg"); return; } } while (false)
3312 Intrinsic::call_preallocated_arg,do { if (!(Call.getCalledFunction()->getIntrinsicID() == Intrinsic
::call_preallocated_arg)) { CheckFailed("preallocated as a call site attribute can only be on "
"llvm.call.preallocated.arg"); return; } } while (false)
3313 "preallocated as a call site attribute can only be on "do { if (!(Call.getCalledFunction()->getIntrinsicID() == Intrinsic
::call_preallocated_arg)) { CheckFailed("preallocated as a call site attribute can only be on "
"llvm.call.preallocated.arg"); return; } } while (false)
3314 "llvm.call.preallocated.arg")do { if (!(Call.getCalledFunction()->getIntrinsicID() == Intrinsic
::call_preallocated_arg)) { CheckFailed("preallocated as a call site attribute can only be on "
"llvm.call.preallocated.arg"); return; } } while (false)
;
3315 }
3316
3317 // Verify call attributes.
3318 verifyFunctionAttrs(FTy, Attrs, &Call, IsIntrinsic, Call.isInlineAsm());
3319
3320 // Conservatively check the inalloca argument.
3321 // We have a bug if we can find that there is an underlying alloca without
3322 // inalloca.
3323 if (Call.hasInAllocaArgument()) {
3324 Value *InAllocaArg = Call.getArgOperand(FTy->getNumParams() - 1);
3325 if (auto AI = dyn_cast<AllocaInst>(InAllocaArg->stripInBoundsOffsets()))
3326 Check(AI->isUsedWithInAlloca(),do { if (!(AI->isUsedWithInAlloca())) { CheckFailed("inalloca argument for call has mismatched alloca"
, AI, Call); return; } } while (false)
3327 "inalloca argument for call has mismatched alloca", AI, Call)do { if (!(AI->isUsedWithInAlloca())) { CheckFailed("inalloca argument for call has mismatched alloca"
, AI, Call); return; } } while (false)
;
3328 }
3329
3330 // For each argument of the callsite, if it has the swifterror argument,
3331 // make sure the underlying alloca/parameter it comes from has a swifterror as
3332 // well.
3333 for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i) {
3334 if (Call.paramHasAttr(i, Attribute::SwiftError)) {
3335 Value *SwiftErrorArg = Call.getArgOperand(i);
3336 if (auto AI = dyn_cast<AllocaInst>(SwiftErrorArg->stripInBoundsOffsets())) {
3337 Check(AI->isSwiftError(),do { if (!(AI->isSwiftError())) { CheckFailed("swifterror argument for call has mismatched alloca"
, AI, Call); return; } } while (false)
3338 "swifterror argument for call has mismatched alloca", AI, Call)do { if (!(AI->isSwiftError())) { CheckFailed("swifterror argument for call has mismatched alloca"
, AI, Call); return; } } while (false)
;
3339 continue;
3340 }
3341 auto ArgI = dyn_cast<Argument>(SwiftErrorArg);
3342 Check(ArgI, "swifterror argument should come from an alloca or parameter",do { if (!(ArgI)) { CheckFailed("swifterror argument should come from an alloca or parameter"
, SwiftErrorArg, Call); return; } } while (false)
3343 SwiftErrorArg, Call)do { if (!(ArgI)) { CheckFailed("swifterror argument should come from an alloca or parameter"
, SwiftErrorArg, Call); return; } } while (false)
;
3344 Check(ArgI->hasSwiftErrorAttr(),do { if (!(ArgI->hasSwiftErrorAttr())) { CheckFailed("swifterror argument for call has mismatched parameter"
, ArgI, Call); return; } } while (false)
3345 "swifterror argument for call has mismatched parameter", ArgI,do { if (!(ArgI->hasSwiftErrorAttr())) { CheckFailed("swifterror argument for call has mismatched parameter"
, ArgI, Call); return; } } while (false)
3346 Call)do { if (!(ArgI->hasSwiftErrorAttr())) { CheckFailed("swifterror argument for call has mismatched parameter"
, ArgI, Call); return; } } while (false)
;
3347 }
3348
3349 if (Attrs.hasParamAttr(i, Attribute::ImmArg)) {
3350 // Don't allow immarg on call sites, unless the underlying declaration
3351 // also has the matching immarg.
3352 Check(Callee && Callee->hasParamAttribute(i, Attribute::ImmArg),do { if (!(Callee && Callee->hasParamAttribute(i, Attribute
::ImmArg))) { CheckFailed("immarg may not apply only to call sites"
, Call.getArgOperand(i), Call); return; } } while (false)
3353 "immarg may not apply only to call sites", Call.getArgOperand(i),do { if (!(Callee && Callee->hasParamAttribute(i, Attribute
::ImmArg))) { CheckFailed("immarg may not apply only to call sites"
, Call.getArgOperand(i), Call); return; } } while (false)
3354 Call)do { if (!(Callee && Callee->hasParamAttribute(i, Attribute
::ImmArg))) { CheckFailed("immarg may not apply only to call sites"
, Call.getArgOperand(i), Call); return; } } while (false)
;
3355 }
3356
3357 if (Call.paramHasAttr(i, Attribute::ImmArg)) {
3358 Value *ArgVal = Call.getArgOperand(i);
3359 Check(isa<ConstantInt>(ArgVal) || isa<ConstantFP>(ArgVal),do { if (!(isa<ConstantInt>(ArgVal) || isa<ConstantFP
>(ArgVal))) { CheckFailed("immarg operand has non-immediate parameter"
, ArgVal, Call); return; } } while (false)
3360 "immarg operand has non-immediate parameter", ArgVal, Call)do { if (!(isa<ConstantInt>(ArgVal) || isa<ConstantFP
>(ArgVal))) { CheckFailed("immarg operand has non-immediate parameter"
, ArgVal, Call); return; } } while (false)
;
3361 }
3362
3363 if (Call.paramHasAttr(i, Attribute::Preallocated)) {
3364 Value *ArgVal = Call.getArgOperand(i);
3365 bool hasOB =
3366 Call.countOperandBundlesOfType(LLVMContext::OB_preallocated) != 0;
3367 bool isMustTail = Call.isMustTailCall();
3368 Check(hasOB != isMustTail,do { if (!(hasOB != isMustTail)) { CheckFailed("preallocated operand either requires a preallocated bundle or "
"the call to be musttail (but not both)", ArgVal, Call); return
; } } while (false)
3369 "preallocated operand either requires a preallocated bundle or "do { if (!(hasOB != isMustTail)) { CheckFailed("preallocated operand either requires a preallocated bundle or "
"the call to be musttail (but not both)", ArgVal, Call); return
; } } while (false)
3370 "the call to be musttail (but not both)",do { if (!(hasOB != isMustTail)) { CheckFailed("preallocated operand either requires a preallocated bundle or "
"the call to be musttail (but not both)", ArgVal, Call); return
; } } while (false)
3371 ArgVal, Call)do { if (!(hasOB != isMustTail)) { CheckFailed("preallocated operand either requires a preallocated bundle or "
"the call to be musttail (but not both)", ArgVal, Call); return
; } } while (false)
;
3372 }
3373 }
3374
3375 if (FTy->isVarArg()) {
3376 // FIXME? is 'nest' even legal here?
3377 bool SawNest = false;
3378 bool SawReturned = false;
3379
3380 for (unsigned Idx = 0; Idx < FTy->getNumParams(); ++Idx) {
3381 if (Attrs.hasParamAttr(Idx, Attribute::Nest))
3382 SawNest = true;
3383 if (Attrs.hasParamAttr(Idx, Attribute::Returned))
3384 SawReturned = true;
3385 }
3386
3387 // Check attributes on the varargs part.
3388 for (unsigned Idx = FTy->getNumParams(); Idx < Call.arg_size(); ++Idx) {
3389 Type *Ty = Call.getArgOperand(Idx)->getType();
3390 AttributeSet ArgAttrs = Attrs.getParamAttrs(Idx);
3391 verifyParameterAttrs(ArgAttrs, Ty, &Call);
3392
3393 if (ArgAttrs.hasAttribute(Attribute::Nest)) {
3394 Check(!SawNest, "More than one parameter has attribute nest!", Call)do { if (!(!SawNest)) { CheckFailed("More than one parameter has attribute nest!"
, Call); return; } } while (false)
;
3395 SawNest = true;
3396 }
3397
3398 if (ArgAttrs.hasAttribute(Attribute::Returned)) {
3399 Check(!SawReturned, "More than one parameter has attribute returned!",do { if (!(!SawReturned)) { CheckFailed("More than one parameter has attribute returned!"
, Call); return; } } while (false)
3400 Call)do { if (!(!SawReturned)) { CheckFailed("More than one parameter has attribute returned!"
, Call); return; } } while (false)
;
3401 Check(Ty->canLosslesslyBitCastTo(FTy->getReturnType()),do { if (!(Ty->canLosslesslyBitCastTo(FTy->getReturnType
()))) { CheckFailed("Incompatible argument and return types for 'returned' "
"attribute", Call); return; } } while (false)
3402 "Incompatible argument and return types for 'returned' "do { if (!(Ty->canLosslesslyBitCastTo(FTy->getReturnType
()))) { CheckFailed("Incompatible argument and return types for 'returned' "
"attribute", Call); return; } } while (false)
3403 "attribute",do { if (!(Ty->canLosslesslyBitCastTo(FTy->getReturnType
()))) { CheckFailed("Incompatible argument and return types for 'returned' "
"attribute", Call); return; } } while (false)
3404 Call)do { if (!(Ty->canLosslesslyBitCastTo(FTy->getReturnType
()))) { CheckFailed("Incompatible argument and return types for 'returned' "
"attribute", Call); return; } } while (false)
;
3405 SawReturned = true;
3406 }
3407
3408 // Statepoint intrinsic is vararg but the wrapped function may be not.
3409 // Allow sret here and check the wrapped function in verifyStatepoint.
3410 if (!Call.getCalledFunction() ||
3411 Call.getCalledFunction()->getIntrinsicID() !=
3412 Intrinsic::experimental_gc_statepoint)
3413 Check(!ArgAttrs.hasAttribute(Attribute::StructRet),do { if (!(!ArgAttrs.hasAttribute(Attribute::StructRet))) { CheckFailed
("Attribute 'sret' cannot be used for vararg call arguments!"
, Call); return; } } while (false)
3414 "Attribute 'sret' cannot be used for vararg call arguments!",do { if (!(!ArgAttrs.hasAttribute(Attribute::StructRet))) { CheckFailed
("Attribute 'sret' cannot be used for vararg call arguments!"
, Call); return; } } while (false)
3415 Call)do { if (!(!ArgAttrs.hasAttribute(Attribute::StructRet))) { CheckFailed
("Attribute 'sret' cannot be used for vararg call arguments!"
, Call); return; } } while (false)
;
3416
3417 if (ArgAttrs.hasAttribute(Attribute::InAlloca))
3418 Check(Idx == Call.arg_size() - 1,do { if (!(Idx == Call.arg_size() - 1)) { CheckFailed("inalloca isn't on the last argument!"
, Call); return; } } while (false)
3419 "inalloca isn't on the last argument!", Call)do { if (!(Idx == Call.arg_size() - 1)) { CheckFailed("inalloca isn't on the last argument!"
, Call); return; } } while (false)
;
3420 }
3421 }
3422
3423 // Verify that there's no metadata unless it's a direct call to an intrinsic.
3424 if (!IsIntrinsic) {
3425 for (Type *ParamTy : FTy->params()) {
3426 Check(!ParamTy->isMetadataTy(),do { if (!(!ParamTy->isMetadataTy())) { CheckFailed("Function has metadata parameter but isn't an intrinsic"
, Call); return; } } while (false)
3427 "Function has metadata parameter but isn't an intrinsic", Call)do { if (!(!ParamTy->isMetadataTy())) { CheckFailed("Function has metadata parameter but isn't an intrinsic"
, Call); return; } } while (false)
;
3428 Check(!ParamTy->isTokenTy(),do { if (!(!ParamTy->isTokenTy())) { CheckFailed("Function has token parameter but isn't an intrinsic"
, Call); return; } } while (false)
3429 "Function has token parameter but isn't an intrinsic", Call)do { if (!(!ParamTy->isTokenTy())) { CheckFailed("Function has token parameter but isn't an intrinsic"
, Call); return; } } while (false)
;
3430 }
3431 }
3432
3433 // Verify that indirect calls don't return tokens.
3434 if (!Call.getCalledFunction()) {
3435 Check(!FTy->getReturnType()->isTokenTy(),do { if (!(!FTy->getReturnType()->isTokenTy())) { CheckFailed
("Return type cannot be token for indirect call!"); return; }
} while (false)
3436 "Return type cannot be token for indirect call!")do { if (!(!FTy->getReturnType()->isTokenTy())) { CheckFailed
("Return type cannot be token for indirect call!"); return; }
} while (false)
;
3437 Check(!FTy->getReturnType()->isX86_AMXTy(),do { if (!(!FTy->getReturnType()->isX86_AMXTy())) { CheckFailed
("Return type cannot be x86_amx for indirect call!"); return;
} } while (false)
3438 "Return type cannot be x86_amx for indirect call!")do { if (!(!FTy->getReturnType()->isX86_AMXTy())) { CheckFailed
("Return type cannot be x86_amx for indirect call!"); return;
} } while (false)
;
3439 }
3440
3441 if (Function *F = Call.getCalledFunction())
3442 if (Intrinsic::ID ID = (Intrinsic::ID)F->getIntrinsicID())
3443 visitIntrinsicCall(ID, Call);
3444
3445 // Verify that a callsite has at most one "deopt", at most one "funclet", at
3446 // most one "gc-transition", at most one "cfguardtarget", at most one
3447 // "preallocated" operand bundle, and at most one "ptrauth" operand bundle.
3448 bool FoundDeoptBundle = false, FoundFuncletBundle = false,
3449 FoundGCTransitionBundle = false, FoundCFGuardTargetBundle = false,
3450 FoundPreallocatedBundle = false, FoundGCLiveBundle = false,
3451 FoundPtrauthBundle = false, FoundKCFIBundle = false,
3452 FoundAttachedCallBundle = false;
3453 for (unsigned i = 0, e = Call.getNumOperandBundles(); i < e; ++i) {
3454 OperandBundleUse BU = Call.getOperandBundleAt(i);
3455 uint32_t Tag = BU.getTagID();
3456 if (Tag == LLVMContext::OB_deopt) {
3457 Check(!FoundDeoptBundle, "Multiple deopt operand bundles", Call)do { if (!(!FoundDeoptBundle)) { CheckFailed("Multiple deopt operand bundles"
, Call); return; } } while (false)
;
3458 FoundDeoptBundle = true;
3459 } else if (Tag == LLVMContext::OB_gc_transition) {
3460 Check(!FoundGCTransitionBundle, "Multiple gc-transition operand bundles",do { if (!(!FoundGCTransitionBundle)) { CheckFailed("Multiple gc-transition operand bundles"
, Call); return; } } while (false)
3461 Call)do { if (!(!FoundGCTransitionBundle)) { CheckFailed("Multiple gc-transition operand bundles"
, Call); return; } } while (false)
;
3462 FoundGCTransitionBundle = true;
3463 } else if (Tag == LLVMContext::OB_funclet) {
3464 Check(!FoundFuncletBundle, "Multiple funclet operand bundles", Call)do { if (!(!FoundFuncletBundle)) { CheckFailed("Multiple funclet operand bundles"
, Call); return; } } while (false)
;
3465 FoundFuncletBundle = true;
3466 Check(BU.Inputs.size() == 1,do { if (!(BU.Inputs.size() == 1)) { CheckFailed("Expected exactly one funclet bundle operand"
, Call); return; } } while (false)
3467 "Expected exactly one funclet bundle operand", Call)do { if (!(BU.Inputs.size() == 1)) { CheckFailed("Expected exactly one funclet bundle operand"
, Call); return; } } while (false)
;
3468 Check(isa<FuncletPadInst>(BU.Inputs.front()),do { if (!(isa<FuncletPadInst>(BU.Inputs.front()))) { CheckFailed
("Funclet bundle operands should correspond to a FuncletPadInst"
, Call); return; } } while (false)
3469 "Funclet bundle operands should correspond to a FuncletPadInst",do { if (!(isa<FuncletPadInst>(BU.Inputs.front()))) { CheckFailed
("Funclet bundle operands should correspond to a FuncletPadInst"
, Call); return; } } while (false)
3470 Call)do { if (!(isa<FuncletPadInst>(BU.Inputs.front()))) { CheckFailed
("Funclet bundle operands should correspond to a FuncletPadInst"
, Call); return; } } while (false)
;
3471 } else if (Tag == LLVMContext::OB_cfguardtarget) {
3472 Check(!FoundCFGuardTargetBundle, "Multiple CFGuardTarget operand bundles",do { if (!(!FoundCFGuardTargetBundle)) { CheckFailed("Multiple CFGuardTarget operand bundles"
, Call); return; } } while (false)
3473 Call)do { if (!(!FoundCFGuardTargetBundle)) { CheckFailed("Multiple CFGuardTarget operand bundles"
, Call); return; } } while (false)
;
3474 FoundCFGuardTargetBundle = true;
3475 Check(BU.Inputs.size() == 1,do { if (!(BU.Inputs.size() == 1)) { CheckFailed("Expected exactly one cfguardtarget bundle operand"
, Call); return; } } while (false)
3476 "Expected exactly one cfguardtarget bundle operand", Call)do { if (!(BU.Inputs.size() == 1)) { CheckFailed("Expected exactly one cfguardtarget bundle operand"
, Call); return; } } while (false)
;
3477 } else if (Tag == LLVMContext::OB_ptrauth) {
3478 Check(!FoundPtrauthBundle, "Multiple ptrauth operand bundles", Call)do { if (!(!FoundPtrauthBundle)) { CheckFailed("Multiple ptrauth operand bundles"
, Call); return; } } while (false)
;
3479 FoundPtrauthBundle = true;
3480 Check(BU.Inputs.size() == 2,do { if (!(BU.Inputs.size() == 2)) { CheckFailed("Expected exactly two ptrauth bundle operands"
, Call); return; } } while (false)
3481 "Expected exactly two ptrauth bundle operands", Call)do { if (!(BU.Inputs.size() == 2)) { CheckFailed("Expected exactly two ptrauth bundle operands"
, Call); return; } } while (false)
;
3482 Check(isa<ConstantInt>(BU.Inputs[0]) &&do { if (!(isa<ConstantInt>(BU.Inputs[0]) && BU
.Inputs[0]->getType()->isIntegerTy(32))) { CheckFailed(
"Ptrauth bundle key operand must be an i32 constant", Call); return
; } } while (false)
3483 BU.Inputs[0]->getType()->isIntegerTy(32),do { if (!(isa<ConstantInt>(BU.Inputs[0]) && BU
.Inputs[0]->getType()->isIntegerTy(32))) { CheckFailed(
"Ptrauth bundle key operand must be an i32 constant", Call); return
; } } while (false)
3484 "Ptrauth bundle key operand must be an i32 constant", Call)do { if (!(isa<ConstantInt>(BU.Inputs[0]) && BU
.Inputs[0]->getType()->isIntegerTy(32))) { CheckFailed(
"Ptrauth bundle key operand must be an i32 constant", Call); return
; } } while (false)
;
3485 Check(BU.Inputs[1]->getType()->isIntegerTy(64),do { if (!(BU.Inputs[1]->getType()->isIntegerTy(64))) {
CheckFailed("Ptrauth bundle discriminator operand must be an i64"
, Call); return; } } while (false)
3486 "Ptrauth bundle discriminator operand must be an i64", Call)do { if (!(BU.Inputs[1]->getType()->isIntegerTy(64))) {
CheckFailed("Ptrauth bundle discriminator operand must be an i64"
, Call); return; } } while (false)
;
3487 } else if (Tag == LLVMContext::OB_kcfi) {
3488 Check(!FoundKCFIBundle, "Multiple kcfi operand bundles", Call)do { if (!(!FoundKCFIBundle)) { CheckFailed("Multiple kcfi operand bundles"
, Call); return; } } while (false)
;
3489 FoundKCFIBundle = true;
3490 Check(BU.Inputs.size() == 1, "Expected exactly one kcfi bundle operand",do { if (!(BU.Inputs.size() == 1)) { CheckFailed("Expected exactly one kcfi bundle operand"
, Call); return; } } while (false)
3491 Call)do { if (!(BU.Inputs.size() == 1)) { CheckFailed("Expected exactly one kcfi bundle operand"
, Call); return; } } while (false)
;
3492 Check(isa<ConstantInt>(BU.Inputs[0]) &&do { if (!(isa<ConstantInt>(BU.Inputs[0]) && BU
.Inputs[0]->getType()->isIntegerTy(32))) { CheckFailed(
"Kcfi bundle operand must be an i32 constant", Call); return;
} } while (false)
3493 BU.Inputs[0]->getType()->isIntegerTy(32),do { if (!(isa<ConstantInt>(BU.Inputs[0]) && BU
.Inputs[0]->getType()->isIntegerTy(32))) { CheckFailed(
"Kcfi bundle operand must be an i32 constant", Call); return;
} } while (false)
3494 "Kcfi bundle operand must be an i32 constant", Call)do { if (!(isa<ConstantInt>(BU.Inputs[0]) && BU
.Inputs[0]->getType()->isIntegerTy(32))) { CheckFailed(
"Kcfi bundle operand must be an i32 constant", Call); return;
} } while (false)
;
3495 } else if (Tag == LLVMContext::OB_preallocated) {
3496 Check(!FoundPreallocatedBundle, "Multiple preallocated operand bundles",do { if (!(!FoundPreallocatedBundle)) { CheckFailed("Multiple preallocated operand bundles"
, Call); return; } } while (false)
3497 Call)do { if (!(!FoundPreallocatedBundle)) { CheckFailed("Multiple preallocated operand bundles"
, Call); return; } } while (false)
;
3498 FoundPreallocatedBundle = true;
3499 Check(BU.Inputs.size() == 1,do { if (!(BU.Inputs.size() == 1)) { CheckFailed("Expected exactly one preallocated bundle operand"
, Call); return; } } while (false)
3500 "Expected exactly one preallocated bundle operand", Call)do { if (!(BU.Inputs.size() == 1)) { CheckFailed("Expected exactly one preallocated bundle operand"
, Call); return; } } while (false)
;
3501 auto Input = dyn_cast<IntrinsicInst>(BU.Inputs.front());
3502 Check(Input &&do { if (!(Input && Input->getIntrinsicID() == Intrinsic
::call_preallocated_setup)) { CheckFailed("\"preallocated\" argument must be a token from "
"llvm.call.preallocated.setup", Call); return; } } while (false
)
3503 Input->getIntrinsicID() == Intrinsic::call_preallocated_setup,do { if (!(Input && Input->getIntrinsicID() == Intrinsic
::call_preallocated_setup)) { CheckFailed("\"preallocated\" argument must be a token from "
"llvm.call.preallocated.setup", Call); return; } } while (false
)
3504 "\"preallocated\" argument must be a token from "do { if (!(Input && Input->getIntrinsicID() == Intrinsic
::call_preallocated_setup)) { CheckFailed("\"preallocated\" argument must be a token from "
"llvm.call.preallocated.setup", Call); return; } } while (false
)
3505 "llvm.call.preallocated.setup",do { if (!(Input && Input->getIntrinsicID() == Intrinsic
::call_preallocated_setup)) { CheckFailed("\"preallocated\" argument must be a token from "
"llvm.call.preallocated.setup", Call); return; } } while (false
)
3506 Call)do { if (!(Input && Input->getIntrinsicID() == Intrinsic
::call_preallocated_setup)) { CheckFailed("\"preallocated\" argument must be a token from "
"llvm.call.preallocated.setup", Call); return; } } while (false
)
;
3507 } else if (Tag == LLVMContext::OB_gc_live) {
3508 Check(!FoundGCLiveBundle, "Multiple gc-live operand bundles", Call)do { if (!(!FoundGCLiveBundle)) { CheckFailed("Multiple gc-live operand bundles"
, Call); return; } } while (false)
;
3509 FoundGCLiveBundle = true;
3510 } else if (Tag == LLVMContext::OB_clang_arc_attachedcall) {
3511 Check(!FoundAttachedCallBundle,do { if (!(!FoundAttachedCallBundle)) { CheckFailed("Multiple \"clang.arc.attachedcall\" operand bundles"
, Call); return; } } while (false)
3512 "Multiple \"clang.arc.attachedcall\" operand bundles", Call)do { if (!(!FoundAttachedCallBundle)) { CheckFailed("Multiple \"clang.arc.attachedcall\" operand bundles"
, Call); return; } } while (false)
;
3513 FoundAttachedCallBundle = true;
3514 verifyAttachedCallBundle(Call, BU);
3515 }
3516 }
3517
3518 // Verify that callee and callsite agree on whether to use pointer auth.
3519 Check(!(Call.getCalledFunction() && FoundPtrauthBundle),do { if (!(!(Call.getCalledFunction() && FoundPtrauthBundle
))) { CheckFailed("Direct call cannot have a ptrauth bundle",
Call); return; } } while (false)
3520 "Direct call cannot have a ptrauth bundle", Call)do { if (!(!(Call.getCalledFunction() && FoundPtrauthBundle
))) { CheckFailed("Direct call cannot have a ptrauth bundle",
Call); return; } } while (false)
;
3521
3522 // Verify that each inlinable callsite of a debug-info-bearing function in a
3523 // debug-info-bearing function has a debug location attached to it. Failure to
3524 // do so causes assertion failures when the inliner sets up inline scope info
3525 // (Interposable functions are not inlinable, neither are functions without
3526 // definitions.)
3527 if (Call.getFunction()->getSubprogram() && Call.getCalledFunction() &&
3528 !Call.getCalledFunction()->isInterposable() &&
3529 !Call.getCalledFunction()->isDeclaration() &&
3530 Call.getCalledFunction()->getSubprogram())
3531 CheckDI(Call.getDebugLoc(),do { if (!(Call.getDebugLoc())) { DebugInfoCheckFailed("inlinable function call in a function with "
"debug info must have a !dbg location", Call); return; } } while
(false)
3532 "inlinable function call in a function with "do { if (!(Call.getDebugLoc())) { DebugInfoCheckFailed("inlinable function call in a function with "
"debug info must have a !dbg location", Call); return; } } while
(false)
3533 "debug info must have a !dbg location",do { if (!(Call.getDebugLoc())) { DebugInfoCheckFailed("inlinable function call in a function with "
"debug info must have a !dbg location", Call); return; } } while
(false)
3534 Call)do { if (!(Call.getDebugLoc())) { DebugInfoCheckFailed("inlinable function call in a function with "
"debug info must have a !dbg location", Call); return; } } while
(false)
;
3535
3536 if (Call.isInlineAsm())
3537 verifyInlineAsmCall(Call);
3538
3539 visitInstruction(Call);
3540}
3541
3542void Verifier::verifyTailCCMustTailAttrs(const AttrBuilder &Attrs,
3543 StringRef Context) {
3544 Check(!Attrs.contains(Attribute::InAlloca),do { if (!(!Attrs.contains(Attribute::InAlloca))) { CheckFailed
(Twine("inalloca attribute not allowed in ") + Context); return
; } } while (false)
3545 Twine("inalloca attribute not allowed in ") + Context)do { if (!(!Attrs.contains(Attribute::InAlloca))) { CheckFailed
(Twine("inalloca attribute not allowed in ") + Context); return
; } } while (false)
;
3546 Check(!Attrs.contains(Attribute::InReg),do { if (!(!Attrs.contains(Attribute::InReg))) { CheckFailed(
Twine("inreg attribute not allowed in ") + Context); return; }
} while (false)
3547 Twine("inreg attribute not allowed in ") + Context)do { if (!(!Attrs.contains(Attribute::InReg))) { CheckFailed(
Twine("inreg attribute not allowed in ") + Context); return; }
} while (false)
;
3548 Check(!Attrs.contains(Attribute::SwiftError),do { if (!(!Attrs.contains(Attribute::SwiftError))) { CheckFailed
(Twine("swifterror attribute not allowed in ") + Context); return
; } } while (false)
3549 Twine("swifterror attribute not allowed in ") + Context)do { if (!(!Attrs.contains(Attribute::SwiftError))) { CheckFailed
(Twine("swifterror attribute not allowed in ") + Context); return
; } } while (false)
;
3550 Check(!Attrs.contains(Attribute::Preallocated),do { if (!(!Attrs.contains(Attribute::Preallocated))) { CheckFailed
(Twine("preallocated attribute not allowed in ") + Context); return
; } } while (false)
3551 Twine("preallocated attribute not allowed in ") + Context)do { if (!(!Attrs.contains(Attribute::Preallocated))) { CheckFailed
(Twine("preallocated attribute not allowed in ") + Context); return
; } } while (false)
;
3552 Check(!Attrs.contains(Attribute::ByRef),do { if (!(!Attrs.contains(Attribute::ByRef))) { CheckFailed(
Twine("byref attribute not allowed in ") + Context); return; }
} while (false)
3553 Twine("byref attribute not allowed in ") + Context)do { if (!(!Attrs.contains(Attribute::ByRef))) { CheckFailed(
Twine("byref attribute not allowed in ") + Context); return; }
} while (false)
;
3554}
3555
3556/// Two types are "congruent" if they are identical, or if they are both pointer
3557/// types with different pointee types and the same address space.
3558static bool isTypeCongruent(Type *L, Type *R) {
3559 if (L == R)
3560 return true;
3561 PointerType *PL = dyn_cast<PointerType>(L);
3562 PointerType *PR = dyn_cast<PointerType>(R);
3563 if (!PL || !PR)
3564 return false;
3565 return PL->getAddressSpace() == PR->getAddressSpace();
3566}
3567
3568static AttrBuilder getParameterABIAttributes(LLVMContext& C, unsigned I, AttributeList Attrs) {
3569 static const Attribute::AttrKind ABIAttrs[] = {
3570 Attribute::StructRet, Attribute::ByVal, Attribute::InAlloca,
3571 Attribute::InReg, Attribute::StackAlignment, Attribute::SwiftSelf,
3572 Attribute::SwiftAsync, Attribute::SwiftError, Attribute::Preallocated,
3573 Attribute::ByRef};
3574 AttrBuilder Copy(C);
3575 for (auto AK : ABIAttrs) {
3576 Attribute Attr = Attrs.getParamAttrs(I).getAttribute(AK);
3577 if (Attr.isValid())
3578 Copy.addAttribute(Attr);
3579 }
3580
3581 // `align` is ABI-affecting only in combination with `byval` or `byref`.
3582 if (Attrs.hasParamAttr(I, Attribute::Alignment) &&
3583 (Attrs.hasParamAttr(I, Attribute::ByVal) ||
3584 Attrs.hasParamAttr(I, Attribute::ByRef)))
3585 Copy.addAlignmentAttr(Attrs.getParamAlignment(I));
3586 return Copy;
3587}
3588
3589void Verifier::verifyMustTailCall(CallInst &CI) {
3590 Check(!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 (false)
;
3591
3592 Function *F = CI.getParent()->getParent();
3593 FunctionType *CallerTy = F->getFunctionType();
3594 FunctionType *CalleeTy = CI.getFunctionType();
3595 Check(CallerTy->isVarArg() == CalleeTy->isVarArg(),do { if (!(CallerTy->isVarArg() == CalleeTy->isVarArg()
)) { CheckFailed("cannot guarantee tail call due to mismatched varargs"
, &CI); return; } } while (false)
3596 "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 (false)
;
3597 Check(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 (false)
3598 "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 (false)
;
3599
3600 // - The calling conventions of the caller and callee must match.
3601 Check(F->getCallingConv() == CI.getCallingConv(),do { if (!(F->getCallingConv() == CI.getCallingConv())) { CheckFailed
("cannot guarantee tail call due to mismatched calling conv",
&CI); return; } } while (false)
3602 "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 (false)
;
3603
3604 // - The call must immediately precede a :ref:`ret <i_ret>` instruction,
3605 // or a pointer bitcast followed by a ret instruction.
3606 // - The ret instruction must return the (possibly bitcasted) value
3607 // produced by the call or void.
3608 Value *RetVal = &CI;
3609 Instruction *Next = CI.getNextNode();
3610
3611 // Handle the optional bitcast.
3612 if (BitCastInst *BI = dyn_cast_or_null<BitCastInst>(Next)) {
3613 Check(BI->getOperand(0) == RetVal,do { if (!(BI->getOperand(0) == RetVal)) { CheckFailed("bitcast following musttail call must use the call"
, BI); return; } } while (false)
3614 "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 (false)
;
3615 RetVal = BI;
3616 Next = BI->getNextNode();
3617 }
3618
3619 // Check the return.
3620 ReturnInst *Ret = dyn_cast_or_null<ReturnInst>(Next);
3621 Check(Ret, "musttail call must precede a ret with an optional bitcast", &CI)do { if (!(Ret)) { CheckFailed("musttail call must precede a ret with an optional bitcast"
, &CI); return; } } while (false)
;
3622 Check(!Ret->getReturnValue() || Ret->getReturnValue() == RetVal ||do { if (!(!Ret->getReturnValue() || Ret->getReturnValue
() == RetVal || isa<UndefValue>(Ret->getReturnValue(
)))) { CheckFailed("musttail call result must be returned", Ret
); return; } } while (false)
3623 isa<UndefValue>(Ret->getReturnValue()),do { if (!(!Ret->getReturnValue() || Ret->getReturnValue
() == RetVal || isa<UndefValue>(Ret->getReturnValue(
)))) { CheckFailed("musttail call result must be returned", Ret
); return; } } while (false)
3624 "musttail call result must be returned", Ret)do { if (!(!Ret->getReturnValue() || Ret->getReturnValue
() == RetVal || isa<UndefValue>(Ret->getReturnValue(
)))) { CheckFailed("musttail call result must be returned", Ret
); return; } } while (false)
;
3625
3626 AttributeList CallerAttrs = F->getAttributes();
3627 AttributeList CalleeAttrs = CI.getAttributes();
3628 if (CI.getCallingConv() == CallingConv::SwiftTail ||
3629 CI.getCallingConv() == CallingConv::Tail) {
3630 StringRef CCName =
3631 CI.getCallingConv() == CallingConv::Tail ? "tailcc" : "swifttailcc";
3632
3633 // - Only sret, byval, swiftself, and swiftasync ABI-impacting attributes
3634 // are allowed in swifttailcc call
3635 for (unsigned I = 0, E = CallerTy->getNumParams(); I != E; ++I) {
3636 AttrBuilder ABIAttrs = getParameterABIAttributes(F->getContext(), I, CallerAttrs);
3637 SmallString<32> Context{CCName, StringRef(" musttail caller")};
3638 verifyTailCCMustTailAttrs(ABIAttrs, Context);
3639 }
3640 for (unsigned I = 0, E = CalleeTy->getNumParams(); I != E; ++I) {
3641 AttrBuilder ABIAttrs = getParameterABIAttributes(F->getContext(), I, CalleeAttrs);
3642 SmallString<32> Context{CCName, StringRef(" musttail callee")};
3643 verifyTailCCMustTailAttrs(ABIAttrs, Context);
3644 }
3645 // - Varargs functions are not allowed
3646 Check(!CallerTy->isVarArg(), Twine("cannot guarantee ") + CCName +do { if (!(!CallerTy->isVarArg())) { CheckFailed(Twine("cannot guarantee "
) + CCName + " tail call for varargs function"); return; } } while
(false)
3647 " tail call for varargs function")do { if (!(!CallerTy->isVarArg())) { CheckFailed(Twine("cannot guarantee "
) + CCName + " tail call for varargs function"); return; } } while
(false)
;
3648 return;
3649 }
3650
3651 // - The caller and callee prototypes must match. Pointer types of
3652 // parameters or return types may differ in pointee type, but not
3653 // address space.
3654 if (!CI.getCalledFunction() || !CI.getCalledFunction()->isIntrinsic()) {
3655 Check(CallerTy->getNumParams() == CalleeTy->getNumParams(),do { if (!(CallerTy->getNumParams() == CalleeTy->getNumParams
())) { CheckFailed("cannot guarantee tail call due to mismatched parameter counts"
, &CI); return; } } while (false)
3656 "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 (false)
;
3657 for (unsigned I = 0, E = CallerTy->getNumParams(); I != E; ++I) {
3658 Check(do { if (!(isTypeCongruent(CallerTy->getParamType(I), CalleeTy
->getParamType(I)))) { CheckFailed("cannot guarantee tail call due to mismatched parameter types"
, &CI); return; } } while (false)
3659 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 (false)
3660 "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 (false)
;
3661 }
3662 }
3663
3664 // - All ABI-impacting function attributes, such as sret, byval, inreg,
3665 // returned, preallocated, and inalloca, must match.
3666 for (unsigned I = 0, E = CallerTy->getNumParams(); I != E; ++I) {
3667 AttrBuilder CallerABIAttrs = getParameterABIAttributes(F->getContext(), I, CallerAttrs);
3668 AttrBuilder CalleeABIAttrs = getParameterABIAttributes(F->getContext(), I, CalleeAttrs);
3669 Check(CallerABIAttrs == CalleeABIAttrs,do { if (!(CallerABIAttrs == CalleeABIAttrs)) { CheckFailed("cannot guarantee tail call due to mismatched ABI impacting "
"function attributes", &CI, CI.getOperand(I)); return; }
} while (false)
3670 "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 (false)
3671 "function attributes",do { if (!(CallerABIAttrs == CalleeABIAttrs)) { CheckFailed("cannot guarantee tail call due to mismatched ABI impacting "
"function attributes", &CI, CI.getOperand(I)); return; }
} while (false)
3672 &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 (false)
;
3673 }
3674}
3675
3676void Verifier::visitCallInst(CallInst &CI) {
3677 visitCallBase(CI);
3678
3679 if (CI.isMustTailCall())
3680 verifyMustTailCall(CI);
3681}
3682
3683void Verifier::visitInvokeInst(InvokeInst &II) {
3684 visitCallBase(II);
3685
3686 // Verify that the first non-PHI instruction of the unwind destination is an
3687 // exception handling instruction.
3688 Check(do { if (!(II.getUnwindDest()->isEHPad())) { CheckFailed("The unwind destination does not have an exception handling instruction!"
, &II); return; } } while (false)
3689 II.getUnwindDest()->isEHPad(),do { if (!(II.getUnwindDest()->isEHPad())) { CheckFailed("The unwind destination does not have an exception handling instruction!"
, &II); return; } } while (false)
3690 "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 (false)
3691 &II)do { if (!(II.getUnwindDest()->isEHPad())) { CheckFailed("The unwind destination does not have an exception handling instruction!"
, &II); return; } } while (false)
;
3692
3693 visitTerminator(II);
3694}
3695
3696/// visitUnaryOperator - Check the argument to the unary operator.
3697///
3698void Verifier::visitUnaryOperator(UnaryOperator &U) {
3699 Check(U.getType() == U.getOperand(0)->getType(),do { if (!(U.getType() == U.getOperand(0)->getType())) { CheckFailed
("Unary operators must have same type for" "operands and result!"
, &U); return; } } while (false)
3700 "Unary operators must have same type for"do { if (!(U.getType() == U.getOperand(0)->getType())) { CheckFailed
("Unary operators must have same type for" "operands and result!"
, &U); return; } } while (false)
3701 "operands and result!",do { if (!(U.getType() == U.getOperand(0)->getType())) { CheckFailed
("Unary operators must have same type for" "operands and result!"
, &U); return; } } while (false)
3702 &U)do { if (!(U.getType() == U.getOperand(0)->getType())) { CheckFailed
("Unary operators must have same type for" "operands and result!"
, &U); return; } } while (false)
;
3703
3704 switch (U.getOpcode()) {
3705 // Check that floating-point arithmetic operators are only used with
3706 // floating-point operands.
3707 case Instruction::FNeg:
3708 Check(U.getType()->isFPOrFPVectorTy(),do { if (!(U.getType()->isFPOrFPVectorTy())) { CheckFailed
("FNeg operator only works with float types!", &U); return
; } } while (false)
3709 "FNeg operator only works with float types!", &U)do { if (!(U.getType()->isFPOrFPVectorTy())) { CheckFailed
("FNeg operator only works with float types!", &U); return
; } } while (false)
;
3710 break;
3711 default:
3712 llvm_unreachable("Unknown UnaryOperator opcode!")::llvm::llvm_unreachable_internal("Unknown UnaryOperator opcode!"
, "llvm/lib/IR/Verifier.cpp", 3712)
;
3713 }
3714
3715 visitInstruction(U);
3716}
3717
3718/// visitBinaryOperator - Check that both arguments to the binary operator are
3719/// of the same type!
3720///
3721void Verifier::visitBinaryOperator(BinaryOperator &B) {
3722 Check(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 (false)
3723 "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 (false)
;
3724
3725 switch (B.getOpcode()) {
3726 // Check that integer arithmetic operators are only used with
3727 // integral operands.
3728 case Instruction::Add:
3729 case Instruction::Sub:
3730 case Instruction::Mul:
3731 case Instruction::SDiv:
3732 case Instruction::UDiv:
3733 case Instruction::SRem:
3734 case Instruction::URem:
3735 Check(B.getType()->isIntOrIntVectorTy(),do { if (!(B.getType()->isIntOrIntVectorTy())) { CheckFailed
("Integer arithmetic operators only work with integral types!"
, &B); return; } } while (false)
3736 "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 (false)
;
3737 Check(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 (false)
3738 "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 (false)
3739 "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 (false)
3740 &B)do { if (!(B.getType() == B.getOperand(0)->getType())) { CheckFailed
("Integer arithmetic operators must have same type " "for operands and result!"
, &B); return; } } while (false)
;
3741 break;
3742 // Check that floating-point arithmetic operators are only used with
3743 // floating-point operands.
3744 case Instruction::FAdd:
3745 case Instruction::FSub:
3746 case Instruction::FMul:
3747 case Instruction::FDiv:
3748 case Instruction::FRem:
3749 Check(B.getType()->isFPOrFPVectorTy(),do { if (!(B.getType()->isFPOrFPVectorTy())) { CheckFailed
("Floating-point arithmetic operators only work with " "floating-point types!"
, &B); return; } } while (false)
3750 "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 (false)
3751 "floating-point types!",do { if (!(B.getType()->isFPOrFPVectorTy())) { CheckFailed
("Floating-point arithmetic operators only work with " "floating-point types!"
, &B); return; } } while (false)
3752 &B)do { if (!(B.getType()->isFPOrFPVectorTy())) { CheckFailed
("Floating-point arithmetic operators only work with " "floating-point types!"
, &B); return; } } while (false)
;
3753 Check(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 (false)
3754 "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 (false)
3755 "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 (false)
3756 &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 (false)
;
3757 break;
3758 // Check that logical operators are only used with integral operands.
3759 case Instruction::And:
3760 case Instruction::Or:
3761 case Instruction::Xor:
3762 Check(B.getType()->isIntOrIntVectorTy(),do { if (!(B.getType()->isIntOrIntVectorTy())) { CheckFailed
("Logical operators only work with integral types!", &B);
return; } } while (false)
3763 "Logical operators only work with integral types!", &B)do { if (!(B.getType()->isIntOrIntVectorTy())) { CheckFailed
("Logical operators only work with integral types!", &B);
return; } } while (false)
;
3764 Check(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 (false)
3765 "Logical operators must have same type for operands and result!", &B)do { if (!(B.getType() == B.getOperand(0)->getType())) { CheckFailed
("Logical operators must have same type for operands and result!"
, &B); return; } } while (false)
;
3766 break;
3767 case Instruction::Shl:
3768 case Instruction::LShr:
3769 case Instruction::AShr:
3770 Check(B.getType()->isIntOrIntVectorTy(),do { if (!(B.getType()->isIntOrIntVectorTy())) { CheckFailed
("Shifts only work with integral types!", &B); return; } }
while (false)
3771 "Shifts only work with integral types!", &B)do { if (!(B.getType()->isIntOrIntVectorTy())) { CheckFailed
("Shifts only work with integral types!", &B); return; } }
while (false)
;
3772 Check(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 (false)
3773 "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 (false)
;
3774 break;
3775 default:
3776 llvm_unreachable("Unknown BinaryOperator opcode!")::llvm::llvm_unreachable_internal("Unknown BinaryOperator opcode!"
, "llvm/lib/IR/Verifier.cpp", 3776)
;
3777 }
3778
3779 visitInstruction(B);
3780}
3781
3782void Verifier::visitICmpInst(ICmpInst &IC) {
3783 // Check that the operands are the same type
3784 Type *Op0Ty = IC.getOperand(0)->getType();
3785 Type *Op1Ty = IC.getOperand(1)->getType();
3786 Check(Op0Ty == Op1Ty,do { if (!(Op0Ty == Op1Ty)) { CheckFailed("Both operands to ICmp instruction are not of the same type!"
, &IC); return; } } while (false)
3787 "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 (false)
;
3788 // Check that the operands are the right type
3789 Check(Op0Ty->isIntOrIntVectorTy() || Op0Ty->isPtrOrPtrVectorTy(),do { if (!(Op0Ty->isIntOrIntVectorTy() || Op0Ty->isPtrOrPtrVectorTy
())) { CheckFailed("Invalid operand types for ICmp instruction"
, &IC); return; } } while (false)
3790 "Invalid operand types for ICmp instruction", &IC)do { if (!(Op0Ty->isIntOrIntVectorTy() || Op0Ty->isPtrOrPtrVectorTy
())) { CheckFailed("Invalid operand types for ICmp instruction"
, &IC); return; } } while (false)
;
3791 // Check that the predicate is valid.
3792 Check(IC.isIntPredicate(), "Invalid predicate in ICmp instruction!", &IC)do { if (!(IC.isIntPredicate())) { CheckFailed("Invalid predicate in ICmp instruction!"
, &IC); return; } } while (false)
;
3793
3794 visitInstruction(IC);
3795}
3796
3797void Verifier::visitFCmpInst(FCmpInst &FC) {
3798 // Check that the operands are the same type
3799 Type *Op0Ty = FC.getOperand(0)->getType();
3800 Type *Op1Ty = FC.getOperand(1)->getType();
3801 Check(Op0Ty == Op1Ty,do { if (!(Op0Ty == Op1Ty)) { CheckFailed("Both operands to FCmp instruction are not of the same type!"
, &FC); return; } } while (false)
3802 "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 (false)
;
3803 // Check that the operands are the right type
3804 Check(Op0Ty->isFPOrFPVectorTy(), "Invalid operand types for FCmp instruction",do { if (!(Op0Ty->isFPOrFPVectorTy())) { CheckFailed("Invalid operand types for FCmp instruction"
, &FC); return; } } while (false)
3805 &FC)do { if (!(Op0Ty->isFPOrFPVectorTy())) { CheckFailed("Invalid operand types for FCmp instruction"
, &FC); return; } } while (false)
;
3806 // Check that the predicate is valid.
3807 Check(FC.isFPPredicate(), "Invalid predicate in FCmp instruction!", &FC)do { if (!(FC.isFPPredicate())) { CheckFailed("Invalid predicate in FCmp instruction!"
, &FC); return; } } while (false)
;
3808
3809 visitInstruction(FC);
3810}
3811
3812void Verifier::visitExtractElementInst(ExtractElementInst &EI) {
3813 Check(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 (false)
3814 "Invalid extractelement operands!", &EI)do { if (!(ExtractElementInst::isValidOperands(EI.getOperand(
0), EI.getOperand(1)))) { CheckFailed("Invalid extractelement operands!"
, &EI); return; } } while (false)
;
3815 visitInstruction(EI);
3816}
3817
3818void Verifier::visitInsertElementInst(InsertElementInst &IE) {
3819 Check(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 (false)
3820 IE.getOperand(2)),do { if (!(InsertElementInst::isValidOperands(IE.getOperand(0
), IE.getOperand(1), IE.getOperand(2)))) { CheckFailed("Invalid insertelement operands!"
, &IE); return; } } while (false)
3821 "Invalid insertelement operands!", &IE)do { if (!(InsertElementInst::isValidOperands(IE.getOperand(0
), IE.getOperand(1), IE.getOperand(2)))) { CheckFailed("Invalid insertelement operands!"
, &IE); return; } } while (false)
;
3822 visitInstruction(IE);
3823}
3824
3825void Verifier::visitShuffleVectorInst(ShuffleVectorInst &SV) {
3826 Check(ShuffleVectorInst::isValidOperands(SV.getOperand(0), SV.getOperand(1),do { if (!(ShuffleVectorInst::isValidOperands(SV.getOperand(0
), SV.getOperand(1), SV.getShuffleMask()))) { CheckFailed("Invalid shufflevector operands!"
, &SV); return; } } while (false)
3827 SV.getShuffleMask()),do { if (!(ShuffleVectorInst::isValidOperands(SV.getOperand(0
), SV.getOperand(1), SV.getShuffleMask()))) { CheckFailed("Invalid shufflevector operands!"
, &SV); return; } } while (false)
3828 "Invalid shufflevector operands!", &SV)do { if (!(ShuffleVectorInst::isValidOperands(SV.getOperand(0
), SV.getOperand(1), SV.getShuffleMask()))) { CheckFailed("Invalid shufflevector operands!"
, &SV); return; } } while (false)
;
3829 visitInstruction(SV);
3830}
3831
3832void Verifier::visitGetElementPtrInst(GetElementPtrInst &GEP) {
3833 Type *TargetTy = GEP.getPointerOperandType()->getScalarType();
3834
3835 Check(isa<PointerType>(TargetTy),do { if (!(isa<PointerType>(TargetTy))) { CheckFailed("GEP base pointer is not a vector or a vector of pointers"
, &GEP); return; } } while (false)
3836 "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 (false)
;
3837 Check(GEP.getSourceElementType()->isSized(), "GEP into unsized type!", &GEP)do { if (!(GEP.getSourceElementType()->isSized())) { CheckFailed
("GEP into unsized type!", &GEP); return; } } while (false
)
;
3838
3839 SmallVector<Value *, 16> Idxs(GEP.indices());
3840 Check(do { if (!(all_of(Idxs, [](Value *V) { return V->getType()
->isIntOrIntVectorTy(); }))) { CheckFailed("GEP indexes must be integers"
, &GEP); return; } } while (false)
3841 all_of(Idxs, [](Value *V) { return V->getType()->isIntOrIntVectorTy(); }),do { if (!(all_of(Idxs, [](Value *V) { return V->getType()
->isIntOrIntVectorTy(); }))) { CheckFailed("GEP indexes must be integers"
, &GEP); return; } } while (false)
3842 "GEP indexes must be integers", &GEP)do { if (!(all_of(Idxs, [](Value *V) { return V->getType()
->isIntOrIntVectorTy(); }))) { CheckFailed("GEP indexes must be integers"
, &GEP); return; } } while (false)
;
3843 Type *ElTy =
3844 GetElementPtrInst::getIndexedType(GEP.getSourceElementType(), Idxs);
3845 Check(ElTy, "Invalid indices for GEP pointer type!", &GEP)do { if (!(ElTy)) { CheckFailed("Invalid indices for GEP pointer type!"
, &GEP); return; } } while (false)
;
3846
3847 Check(GEP.getType()->isPtrOrPtrVectorTy() &&do { if (!(GEP.getType()->isPtrOrPtrVectorTy() && GEP
.getResultElementType() == ElTy)) { CheckFailed("GEP is not of right type for indices!"
, &GEP, ElTy); return; } } while (false)
3848 GEP.getResultElementType() == ElTy,do { if (!(GEP.getType()->isPtrOrPtrVectorTy() && GEP
.getResultElementType() == ElTy)) { CheckFailed("GEP is not of right type for indices!"
, &GEP, ElTy); return; } } while (false)
3849 "GEP is not of right type for indices!", &GEP, ElTy)do { if (!(GEP.getType()->isPtrOrPtrVectorTy() && GEP
.getResultElementType() == ElTy)) { CheckFailed("GEP is not of right type for indices!"
, &GEP, ElTy); return; } } while (false)
;
3850
3851 if (auto *GEPVTy = dyn_cast<VectorType>(GEP.getType())) {
3852 // Additional checks for vector GEPs.
3853 ElementCount GEPWidth = GEPVTy->getElementCount();
3854 if (GEP.getPointerOperandType()->isVectorTy())
3855 Check(do { if (!(GEPWidth == cast<VectorType>(GEP.getPointerOperandType
())->getElementCount())) { CheckFailed("Vector GEP result width doesn't match operand's"
, &GEP); return; } } while (false)
3856 GEPWidth ==do { if (!(GEPWidth == cast<VectorType>(GEP.getPointerOperandType
())->getElementCount())) { CheckFailed("Vector GEP result width doesn't match operand's"
, &GEP); return; } } while (false)
3857 cast<VectorType>(GEP.getPointerOperandType())->getElementCount(),do { if (!(GEPWidth == cast<VectorType>(GEP.getPointerOperandType
())->getElementCount())) { CheckFailed("Vector GEP result width doesn't match operand's"
, &GEP); return; } } while (false)
3858 "Vector GEP result width doesn't match operand's", &GEP)do { if (!(GEPWidth == cast<VectorType>(GEP.getPointerOperandType
())->getElementCount())) { CheckFailed("Vector GEP result width doesn't match operand's"
, &GEP); return; } } while (false)
;
3859 for (Value *Idx : Idxs) {
3860 Type *IndexTy = Idx->getType();
3861 if (auto *IndexVTy = dyn_cast<VectorType>(IndexTy)) {
3862 ElementCount IndexWidth = IndexVTy->getElementCount();
3863 Check(IndexWidth == GEPWidth, "Invalid GEP index vector width", &GEP)do { if (!(IndexWidth == GEPWidth)) { CheckFailed("Invalid GEP index vector width"
, &GEP); return; } } while (false)
;
3864 }
3865 Check(IndexTy->isIntOrIntVectorTy(),do { if (!(IndexTy->isIntOrIntVectorTy())) { CheckFailed("All GEP indices should be of integer type"
); return; } } while (false)
3866 "All GEP indices should be of integer type")do { if (!(IndexTy->isIntOrIntVectorTy())) { CheckFailed("All GEP indices should be of integer type"
); return; } } while (false)
;
3867 }
3868 }
3869
3870 if (auto *PTy = dyn_cast<PointerType>(GEP.getType())) {
3871 Check(GEP.getAddressSpace() == PTy->getAddressSpace(),do { if (!(GEP.getAddressSpace() == PTy->getAddressSpace()
)) { CheckFailed("GEP address space doesn't match type", &
GEP); return; } } while (false)
3872 "GEP address space doesn't match type", &GEP)do { if (!(GEP.getAddressSpace() == PTy->getAddressSpace()
)) { CheckFailed("GEP address space doesn't match type", &
GEP); return; } } while (false)
;
3873 }
3874
3875 visitInstruction(GEP);
3876}
3877
3878static bool isContiguous(const ConstantRange &A, const ConstantRange &B) {
3879 return A.getUpper() == B.getLower() || A.getLower() == B.getUpper();
3880}
3881
3882void Verifier::visitRangeMetadata(Instruction &I, MDNode *Range, Type *Ty) {
3883 assert(Range && Range == I.getMetadata(LLVMContext::MD_range) &&(static_cast <bool> (Range && Range == I.getMetadata
(LLVMContext::MD_range) && "precondition violation") ?
void (0) : __assert_fail ("Range && Range == I.getMetadata(LLVMContext::MD_range) && \"precondition violation\""
, "llvm/lib/IR/Verifier.cpp", 3884, __extension__ __PRETTY_FUNCTION__
))
3884 "precondition violation")(static_cast <bool> (Range && Range == I.getMetadata
(LLVMContext::MD_range) && "precondition violation") ?
void (0) : __assert_fail ("Range && Range == I.getMetadata(LLVMContext::MD_range) && \"precondition violation\""
, "llvm/lib/IR/Verifier.cpp", 3884, __extension__ __PRETTY_FUNCTION__
))
;
3885
3886 unsigned NumOperands = Range->getNumOperands();
3887 Check(NumOperands % 2 == 0, "Unfinished range!", Range)do { if (!(NumOperands % 2 == 0)) { CheckFailed("Unfinished range!"
, Range); return; } } while (false)
;
3888 unsigned NumRanges = NumOperands / 2;
3889 Check(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 (false)
;
3890
3891 ConstantRange LastRange(1, true); // Dummy initial value
3892 for (unsigned i = 0; i < NumRanges; ++i) {
3893 ConstantInt *Low =
3894 mdconst::dyn_extract<ConstantInt>(Range->getOperand(2 * i));
3895 Check(Low, "The lower limit must be an integer!", Low)do { if (!(Low)) { CheckFailed("The lower limit must be an integer!"
, Low); return; } } while (false)
;
3896 ConstantInt *High =
3897 mdconst::dyn_extract<ConstantInt>(Range->getOperand(2 * i + 1));
3898 Check(High, "The upper limit must be an integer!", High)do { if (!(High)) { CheckFailed("The upper limit must be an integer!"
, High); return; } } while (false)
;
3899 Check(High->getType() == Low->getType() &&do { if (!(High->getType() == Low->getType() &&
High->getType() == Ty->getScalarType())) { CheckFailed
("Range types must match instruction type!", &I); return;
} } while (false)
3900 High->getType() == Ty->getScalarType(),do { if (!(High->getType() == Low->getType() &&
High->getType() == Ty->getScalarType())) { CheckFailed
("Range types must match instruction type!", &I); return;
} } while (false)
3901 "Range types must match instruction type!", &I)do { if (!(High->getType() == Low->getType() &&
High->getType() == Ty->getScalarType())) { CheckFailed
("Range types must match instruction type!", &I); return;
} } while (false)
;
3902
3903 APInt HighV = High->getValue();
3904 APInt LowV = Low->getValue();
3905 ConstantRange CurRange(LowV, HighV);
3906 Check(!CurRange.isEmptySet() && !CurRange.isFullSet(),do { if (!(!CurRange.isEmptySet() && !CurRange.isFullSet
())) { CheckFailed("Range must not be empty!", Range); return
; } } while (false)
3907 "Range must not be empty!", Range)do { if (!(!CurRange.isEmptySet() && !CurRange.isFullSet
())) { CheckFailed("Range must not be empty!", Range); return
; } } while (false)
;
3908 if (i != 0) {
3909 Check(CurRange.intersectWith(LastRange).isEmptySet(),do { if (!(CurRange.intersectWith(LastRange).isEmptySet())) {
CheckFailed("Intervals are overlapping", Range); return; } }
while (false)
3910 "Intervals are overlapping", Range)do { if (!(CurRange.intersectWith(LastRange).isEmptySet())) {
CheckFailed("Intervals are overlapping", Range); return; } }
while (false)
;
3911 Check(LowV.sgt(LastRange.getLower()), "Intervals are not in order",do { if (!(LowV.sgt(LastRange.getLower()))) { CheckFailed("Intervals are not in order"
, Range); return; } } while (false)
3912 Range)do { if (!(LowV.sgt(LastRange.getLower()))) { CheckFailed("Intervals are not in order"
, Range); return; } } while (false)
;
3913 Check(!isContiguous(CurRange, LastRange), "Intervals are contiguous",do { if (!(!isContiguous(CurRange, LastRange))) { CheckFailed
("Intervals are contiguous", Range); return; } } while (false
)
3914 Range)do { if (!(!isContiguous(CurRange, LastRange))) { CheckFailed
("Intervals are contiguous", Range); return; } } while (false
)
;
3915 }
3916 LastRange = ConstantRange(LowV, HighV);
3917 }
3918 if (NumRanges > 2) {
3919 APInt FirstLow =
3920 mdconst::dyn_extract<ConstantInt>(Range->getOperand(0))->getValue();
3921 APInt FirstHigh =
3922 mdconst::dyn_extract<ConstantInt>(Range->getOperand(1))->getValue();
3923 ConstantRange FirstRange(FirstLow, FirstHigh);
3924 Check(FirstRange.intersectWith(LastRange).isEmptySet(),do { if (!(FirstRange.intersectWith(LastRange).isEmptySet()))
{ CheckFailed("Intervals are overlapping", Range); return; }
} while (false)
3925 "Intervals are overlapping", Range)do { if (!(FirstRange.intersectWith(LastRange).isEmptySet()))
{ CheckFailed("Intervals are overlapping", Range); return; }
} while (false)
;
3926 Check(!isContiguous(FirstRange, LastRange), "Intervals are contiguous",do { if (!(!isContiguous(FirstRange, LastRange))) { CheckFailed
("Intervals are contiguous", Range); return; } } while (false
)
3927 Range)do { if (!(!isContiguous(FirstRange, LastRange))) { CheckFailed
("Intervals are contiguous", Range); return; } } while (false
)
;
3928 }
3929}
3930
3931void Verifier::checkAtomicMemAccessSize(Type *Ty, const Instruction *I) {
3932 unsigned Size = DL.getTypeSizeInBits(Ty);
3933 Check(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 (false)
;
3934 Check(!(Size & (Size - 1)),do { if (!(!(Size & (Size - 1)))) { CheckFailed("atomic memory access' operand must have a power-of-two size"
, Ty, I); return; } } while (false)
3935 "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 (false)
;
3936}
3937
3938void Verifier::visitLoadInst(LoadInst &LI) {
3939 PointerType *PTy = dyn_cast<PointerType>(LI.getOperand(0)->getType());
3940 Check(PTy, "Load operand must be a pointer.", &LI)do { if (!(PTy)) { CheckFailed("Load operand must be a pointer."
, &LI); return; } } while (false)
;
3941 Type *ElTy = LI.getType();
3942 if (MaybeAlign A = LI.getAlign()) {
3943 Check(A->value() <= Value::MaximumAlignment,do { if (!(A->value() <= Value::MaximumAlignment)) { CheckFailed
("huge alignment values are unsupported", &LI); return; }
} while (false)
3944 "huge alignment values are unsupported", &LI)do { if (!(A->value() <= Value::MaximumAlignment)) { CheckFailed
("huge alignment values are unsupported", &LI); return; }
} while (false)
;
3945 }
3946 Check(ElTy->isSized(), "loading unsized types is not allowed", &LI)do { if (!(ElTy->isSized())) { CheckFailed("loading unsized types is not allowed"
, &LI); return; } } while (false)
;
3947 if (LI.isAtomic()) {
3948 Check(LI.getOrdering() != AtomicOrdering::Release &&do { if (!(LI.getOrdering() != AtomicOrdering::Release &&
LI.getOrdering() != AtomicOrdering::AcquireRelease)) { CheckFailed
("Load cannot have Release ordering", &LI); return; } } while
(false)
3949 LI.getOrdering() != AtomicOrdering::AcquireRelease,do { if (!(LI.getOrdering() != AtomicOrdering::Release &&
LI.getOrdering() != AtomicOrdering::AcquireRelease)) { CheckFailed
("Load cannot have Release ordering", &LI); return; } } while
(false)
3950 "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
(false)
;
3951 Check(ElTy->isIntOrPtrTy() || ElTy->isFloatingPointTy(),do { if (!(ElTy->isIntOrPtrTy() || ElTy->isFloatingPointTy
())) { CheckFailed("atomic load operand must have integer, pointer, or floating point "
"type!", ElTy, &LI); return; } } while (false)
3952 "atomic load operand must have integer, pointer, or floating point "do { if (!(ElTy->isIntOrPtrTy() || ElTy->isFloatingPointTy
())) { CheckFailed("atomic load operand must have integer, pointer, or floating point "
"type!", ElTy, &LI); return; } } while (false)
3953 "type!",do { if (!(ElTy->isIntOrPtrTy() || ElTy->isFloatingPointTy
())) { CheckFailed("atomic load operand must have integer, pointer, or floating point "
"type!", ElTy, &LI); return; } } while (false)
3954 ElTy, &LI)do { if (!(ElTy->isIntOrPtrTy() || ElTy->isFloatingPointTy
())) { CheckFailed("atomic load operand must have integer, pointer, or floating point "
"type!", ElTy, &LI); return; } } while (false)
;
3955 checkAtomicMemAccessSize(ElTy, &LI);
3956 } else {
3957 Check(LI.getSyncScopeID() == SyncScope::System,do { if (!(LI.getSyncScopeID() == SyncScope::System)) { CheckFailed
("Non-atomic load cannot have SynchronizationScope specified"
, &LI); return; } } while (false)
3958 "Non-atomic load cannot have SynchronizationScope specified", &LI)do { if (!(LI.getSyncScopeID() == SyncScope::System)) { CheckFailed
("Non-atomic load cannot have SynchronizationScope specified"
, &LI); return; } } while (false)
;
3959 }
3960
3961 visitInstruction(LI);
3962}
3963
3964void Verifier::visitStoreInst(StoreInst &SI) {
3965 PointerType *PTy = dyn_cast<PointerType>(SI.getOperand(1)->getType());
3966 Check(PTy, "Store operand must be a pointer.", &SI)do { if (!(PTy)) { CheckFailed("Store operand must be a pointer."
, &SI); return; } } while (false)
;
3967 Type *ElTy = SI.getOperand(0)->getType();
3968 Check(PTy->isOpaqueOrPointeeTypeMatches(ElTy),do { if (!(PTy->isOpaqueOrPointeeTypeMatches(ElTy))) { CheckFailed
("Stored value type does not match pointer operand type!", &
SI, ElTy); return; } } while (false)
3969 "Stored value type does not match pointer operand type!", &SI, ElTy)do { if (!(PTy->isOpaqueOrPointeeTypeMatches(ElTy))) { CheckFailed
("Stored value type does not match pointer operand type!", &
SI, ElTy); return; } } while (false)
;
3970 if (MaybeAlign A = SI.getAlign()) {
3971 Check(A->value() <= Value::MaximumAlignment,do { if (!(A->value() <= Value::MaximumAlignment)) { CheckFailed
("huge alignment values are unsupported", &SI); return; }
} while (false)
3972 "huge alignment values are unsupported", &SI)do { if (!(A->value() <= Value::MaximumAlignment)) { CheckFailed
("huge alignment values are unsupported", &SI); return; }
} while (false)
;
3973 }
3974 Check(ElTy->isSized(), "storing unsized types is not allowed", &SI)do { if (!(ElTy->isSized())) { CheckFailed("storing unsized types is not allowed"
, &SI); return; } } while (false)
;
3975 if (SI.isAtomic()) {
3976 Check(SI.getOrdering() != AtomicOrdering::Acquire &&do { if (!(SI.getOrdering() != AtomicOrdering::Acquire &&
SI.getOrdering() != AtomicOrdering::AcquireRelease)) { CheckFailed
("Store cannot have Acquire ordering", &SI); return; } } while
(false)
3977 SI.getOrdering() != AtomicOrdering::AcquireRelease,do { if (!(SI.getOrdering() != AtomicOrdering::Acquire &&
SI.getOrdering() != AtomicOrdering::AcquireRelease)) { CheckFailed
("Store cannot have Acquire ordering", &SI); return; } } while
(false)
3978 "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
(false)
;
3979 Check(ElTy->isIntOrPtrTy() || ElTy->isFloatingPointTy(),do { if (!(ElTy->isIntOrPtrTy() || ElTy->isFloatingPointTy
())) { CheckFailed("atomic store operand must have integer, pointer, or floating point "
"type!", ElTy, &SI); return; } } while (false)
3980 "atomic store operand must have integer, pointer, or floating point "do { if (!(ElTy->isIntOrPtrTy() || ElTy->isFloatingPointTy
())) { CheckFailed("atomic store operand must have integer, pointer, or floating point "
"type!", ElTy, &SI); return; } } while (false)
3981 "type!",do { if (!(ElTy->isIntOrPtrTy() || ElTy->isFloatingPointTy
())) { CheckFailed("atomic store operand must have integer, pointer, or floating point "
"type!", ElTy, &SI); return; } } while (false)
3982 ElTy, &SI)do { if (!(ElTy->isIntOrPtrTy() || ElTy->isFloatingPointTy
())) { CheckFailed("atomic store operand must have integer, pointer, or floating point "
"type!", ElTy, &SI); return; } } while (false)
;
3983 checkAtomicMemAccessSize(ElTy, &SI);
3984 } else {
3985 Check(SI.getSyncScopeID() == SyncScope::System,do { if (!(SI.getSyncScopeID() == SyncScope::System)) { CheckFailed
("Non-atomic store cannot have SynchronizationScope specified"
, &SI); return; } } while (false)
3986 "Non-atomic store cannot have SynchronizationScope specified", &SI)do { if (!(SI.getSyncScopeID() == SyncScope::System)) { CheckFailed
("Non-atomic store cannot have SynchronizationScope specified"
, &SI); return; } } while (false)
;
3987 }
3988 visitInstruction(SI);
3989}
3990
3991/// Check that SwiftErrorVal is used as a swifterror argument in CS.
3992void Verifier::verifySwiftErrorCall(CallBase &Call,
3993 const Value *SwiftErrorVal) {
3994 for (const auto &I : llvm::enumerate(Call.args())) {
3995 if (I.value() == SwiftErrorVal) {
3996 Check(Call.paramHasAttr(I.index(), Attribute::SwiftError),do { if (!(Call.paramHasAttr(I.index(), Attribute::SwiftError
))) { CheckFailed("swifterror value when used in a callsite should be marked "
"with swifterror attribute", SwiftErrorVal, Call); return; }
} while (false)
3997 "swifterror value when used in a callsite should be marked "do { if (!(Call.paramHasAttr(I.index(), Attribute::SwiftError
))) { CheckFailed("swifterror value when used in a callsite should be marked "
"with swifterror attribute", SwiftErrorVal, Call); return; }
} while (false)
3998 "with swifterror attribute",do { if (!(Call.paramHasAttr(I.index(), Attribute::SwiftError
))) { CheckFailed("swifterror value when used in a callsite should be marked "
"with swifterror attribute", SwiftErrorVal, Call); return; }
} while (false)
3999 SwiftErrorVal, Call)do { if (!(Call.paramHasAttr(I.index(), Attribute::SwiftError
))) { CheckFailed("swifterror value when used in a callsite should be marked "
"with swifterror attribute", SwiftErrorVal, Call); return; }
} while (false)
;
4000 }
4001 }
4002}
4003
4004void Verifier::verifySwiftErrorValue(const Value *SwiftErrorVal) {
4005 // Check that swifterror value is only used by loads, stores, or as
4006 // a swifterror argument.
4007 for (const User *U : SwiftErrorVal->users()) {
4008 Check(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 (false)
4009 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 (false)
4010 "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 (false)
4011 "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 (false)
4012 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 (false)
;
4013 // If it is used by a store, check it is the second operand.
4014 if (auto StoreI = dyn_cast<StoreInst>(U))
4015 Check(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 (false)
4016 "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 (false)
4017 "by stores",do { if (!(StoreI->getOperand(1) == SwiftErrorVal)) { CheckFailed
("swifterror value should be the second operand when used " "by stores"
, SwiftErrorVal, U); return; } } while (false)
4018 SwiftErrorVal, U)do { if (!(StoreI->getOperand(1) == SwiftErrorVal)) { CheckFailed
("swifterror value should be the second operand when used " "by stores"
, SwiftErrorVal, U); return; } } while (false)
;
4019 if (auto *Call = dyn_cast<CallBase>(U))
4020 verifySwiftErrorCall(*const_cast<CallBase *>(Call), SwiftErrorVal);
4021 }
4022}
4023
4024void Verifier::visitAllocaInst(AllocaInst &AI) {
4025 SmallPtrSet<Type*, 4> Visited;
4026 Check(AI.getAllocatedType()->isSized(&Visited),do { if (!(AI.getAllocatedType()->isSized(&Visited))) {
CheckFailed("Cannot allocate unsized type", &AI); return
; } } while (false)
4027 "Cannot allocate unsized type", &AI)do { if (!(AI.getAllocatedType()->isSized(&Visited))) {
CheckFailed("Cannot allocate unsized type", &AI); return
; } } while (false)
;
4028 Check(AI.getArraySize()->getType()->isIntegerTy(),do { if (!(AI.getArraySize()->getType()->isIntegerTy())
) { CheckFailed("Alloca array size must have integer type", &
AI); return; } } while (false)
4029 "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 (false)
;
4030 if (MaybeAlign A = AI.getAlign()) {
4031 Check(A->value() <= Value::MaximumAlignment,do { if (!(A->value() <= Value::MaximumAlignment)) { CheckFailed
("huge alignment values are unsupported", &AI); return; }
} while (false)
4032 "huge alignment values are unsupported", &AI)do { if (!(A->value() <= Value::MaximumAlignment)) { CheckFailed
("huge alignment values are unsupported", &AI); return; }
} while (false)
;
4033 }
4034
4035 if (AI.isSwiftError()) {
4036 Check(AI.getAllocatedType()->isPointerTy(),do { if (!(AI.getAllocatedType()->isPointerTy())) { CheckFailed
("swifterror alloca must have pointer type", &AI); return
; } } while (false)
4037 "swifterror alloca must have pointer type", &AI)do { if (!(AI.getAllocatedType()->isPointerTy())) { CheckFailed
("swifterror alloca must have pointer type", &AI); return
; } } while (false)
;
4038 Check(!AI.isArrayAllocation(),do { if (!(!AI.isArrayAllocation())) { CheckFailed("swifterror alloca must not be array allocation"
, &AI); return; } } while (false)
4039 "swifterror alloca must not be array allocation", &AI)do { if (!(!AI.isArrayAllocation())) { CheckFailed("swifterror alloca must not be array allocation"
, &AI); return; } } while (false)
;
4040 verifySwiftErrorValue(&AI);
4041 }
4042
4043 visitInstruction(AI);
4044}
4045
4046void Verifier::visitAtomicCmpXchgInst(AtomicCmpXchgInst &CXI) {
4047 Type *ElTy = CXI.getOperand(1)->getType();
4048 Check(ElTy->isIntOrPtrTy(),do { if (!(ElTy->isIntOrPtrTy())) { CheckFailed("cmpxchg operand must have integer or pointer type"
, ElTy, &CXI); return; } } while (false)
4049 "cmpxchg operand must have integer or pointer type", ElTy, &CXI)do { if (!(ElTy->isIntOrPtrTy())) { CheckFailed("cmpxchg operand must have integer or pointer type"
, ElTy, &CXI); return; } } while (false)
;
4050 checkAtomicMemAccessSize(ElTy, &CXI);
4051 visitInstruction(CXI);
4052}
4053
4054void Verifier::visitAtomicRMWInst(AtomicRMWInst &RMWI) {
4055 Check(RMWI.getOrdering() != AtomicOrdering::Unordered,do { if (!(RMWI.getOrdering() != AtomicOrdering::Unordered)) {
CheckFailed("atomicrmw instructions cannot be unordered.", &
RMWI); return; } } while (false)
4056 "atomicrmw instructions cannot be unordered.", &RMWI)do { if (!(RMWI.getOrdering() != AtomicOrdering::Unordered)) {
CheckFailed("atomicrmw instructions cannot be unordered.", &
RMWI); return; } } while (false)
;
4057 auto Op = RMWI.getOperation();
4058 Type *ElTy = RMWI.getOperand(1)->getType();
4059 if (Op == AtomicRMWInst::Xchg) {
4060 Check(ElTy->isIntegerTy() || ElTy->isFloatingPointTy() ||do { if (!(ElTy->isIntegerTy() || ElTy->isFloatingPointTy
() || ElTy->isPointerTy())) { CheckFailed("atomicrmw " + AtomicRMWInst
::getOperationName(Op) + " operand must have integer or floating point type!"
, &RMWI, ElTy); return; } } while (false)
4061 ElTy->isPointerTy(),do { if (!(ElTy->isIntegerTy() || ElTy->isFloatingPointTy
() || ElTy->isPointerTy())) { CheckFailed("atomicrmw " + AtomicRMWInst
::getOperationName(Op) + " operand must have integer or floating point type!"
, &RMWI, ElTy); return; } } while (false)
4062 "atomicrmw " + AtomicRMWInst::getOperationName(Op) +do { if (!(ElTy->isIntegerTy() || ElTy->isFloatingPointTy
() || ElTy->isPointerTy())) { CheckFailed("atomicrmw " + AtomicRMWInst
::getOperationName(Op) + " operand must have integer or floating point type!"
, &RMWI, ElTy); return; } } while (false)
4063 " operand must have integer or floating point type!",do { if (!(ElTy->isIntegerTy() || ElTy->isFloatingPointTy
() || ElTy->isPointerTy())) { CheckFailed("atomicrmw " + AtomicRMWInst
::getOperationName(Op) + " operand must have integer or floating point type!"
, &RMWI, ElTy); return; } } while (false)
4064 &RMWI, ElTy)do { if (!(ElTy->isIntegerTy() || ElTy->isFloatingPointTy
() || ElTy->isPointerTy())) { CheckFailed("atomicrmw " + AtomicRMWInst
::getOperationName(Op) + " operand must have integer or floating point type!"
, &RMWI, ElTy); return; } } while (false)
;
4065 } else if (AtomicRMWInst::isFPOperation(Op)) {
4066 Check(ElTy->isFloatingPointTy(),do { if (!(ElTy->isFloatingPointTy())) { CheckFailed("atomicrmw "
+ AtomicRMWInst::getOperationName(Op) + " operand must have floating point type!"
, &RMWI, ElTy); return; } } while (false)
4067 "atomicrmw " + AtomicRMWInst::getOperationName(Op) +do { if (!(ElTy->isFloatingPointTy())) { CheckFailed("atomicrmw "
+ AtomicRMWInst::getOperationName(Op) + " operand must have floating point type!"
, &RMWI, ElTy); return; } } while (false)
4068 " operand must have floating point type!",do { if (!(ElTy->isFloatingPointTy())) { CheckFailed("atomicrmw "
+ AtomicRMWInst::getOperationName(Op) + " operand must have floating point type!"
, &RMWI, ElTy); return; } } while (false)
4069 &RMWI, ElTy)do { if (!(ElTy->isFloatingPointTy())) { CheckFailed("atomicrmw "
+ AtomicRMWInst::getOperationName(Op) + " operand must have floating point type!"
, &RMWI, ElTy); return; } } while (false)
;
4070 } else {
4071 Check(ElTy->isIntegerTy(),do { if (!(ElTy->isIntegerTy())) { CheckFailed("atomicrmw "
+ AtomicRMWInst::getOperationName(Op) + " operand must have integer type!"
, &RMWI, ElTy); return; } } while (false)
4072 "atomicrmw " + AtomicRMWInst::getOperationName(Op) +do { if (!(ElTy->isIntegerTy())) { CheckFailed("atomicrmw "
+ AtomicRMWInst::getOperationName(Op) + " operand must have integer type!"
, &RMWI, ElTy); return; } } while (false)
4073 " operand must have integer type!",do { if (!(ElTy->isIntegerTy())) { CheckFailed("atomicrmw "
+ AtomicRMWInst::getOperationName(Op) + " operand must have integer type!"
, &RMWI, ElTy); return; } } while (false)
4074 &RMWI, ElTy)do { if (!(ElTy->isIntegerTy())) { CheckFailed("atomicrmw "
+ AtomicRMWInst::getOperationName(Op) + " operand must have integer type!"
, &RMWI, ElTy); return; } } while (false)
;
4075 }
4076 checkAtomicMemAccessSize(ElTy, &RMWI);
4077 Check(AtomicRMWInst::FIRST_BINOP <= Op && Op <= AtomicRMWInst::LAST_BINOP,do { if (!(AtomicRMWInst::FIRST_BINOP <= Op && Op <=
AtomicRMWInst::LAST_BINOP)) { CheckFailed("Invalid binary operation!"
, &RMWI); return; } } while (false)
4078 "Invalid binary operation!", &RMWI)do { if (!(AtomicRMWInst::FIRST_BINOP <= Op && Op <=
AtomicRMWInst::LAST_BINOP)) { CheckFailed("Invalid binary operation!"
, &RMWI); return; } } while (false)
;
4079