mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
The verifier just invokes this method, so we aren't losing any verification in the SILVerifier itself. The reason why I am extracting this information into a helper is that often times one hits these structural assertions in the verifier making one have to track down where in a pass the bad location was actually inserted. To make these easier to find, I am going to change the SILBuilder to invoke these structural comparisons so that we can catch these problems at the call site making it easier to fix code.
58 lines
2.0 KiB
C++
58 lines
2.0 KiB
C++
//===--- DebugInfoVerifier.cpp --------------------------------------------===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors
|
|
// Licensed under Apache License v2.0 with Runtime Library Exception
|
|
//
|
|
// See https://swift.org/LICENSE.txt for license information
|
|
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
///
|
|
/// \file
|
|
///
|
|
/// Utility verifier code for validating debug info.
|
|
///
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "swift/SIL/SILDebugScope.h"
|
|
#include "swift/SIL/SILInstruction.h"
|
|
|
|
using namespace swift;
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// MARK: Verify SILInstruction Debug Info
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
void SILInstruction::verifyDebugInfo() const {
|
|
auto require = [&](bool reqt, StringRef message) {
|
|
if (!reqt) {
|
|
llvm::errs() << message << "\n";
|
|
assert(false && "invoking standard assertion failure");
|
|
}
|
|
};
|
|
|
|
// Check the location kind.
|
|
SILLocation loc = getLoc();
|
|
SILLocation::LocationKind locKind = loc.getKind();
|
|
SILInstructionKind instKind = getKind();
|
|
|
|
// Regular locations are allowed on all instructions.
|
|
if (locKind == SILLocation::RegularKind)
|
|
return;
|
|
|
|
if (locKind == SILLocation::ReturnKind ||
|
|
locKind == SILLocation::ImplicitReturnKind)
|
|
require(
|
|
instKind == SILInstructionKind::BranchInst ||
|
|
instKind == SILInstructionKind::ReturnInst ||
|
|
instKind == SILInstructionKind::UnreachableInst,
|
|
"return locations are only allowed on branch and return instructions");
|
|
|
|
if (locKind == SILLocation::ArtificialUnreachableKind)
|
|
require(
|
|
instKind == SILInstructionKind::UnreachableInst,
|
|
"artificial locations are only allowed on Unreachable instructions");
|
|
}
|