Files
swift-mirror/lib/SIL/Verifier/DebugInfoVerifier.cpp
Michael Gottesman 8085754f09 [sil][debug-info] Refactor from the SILVerifier structural verification of debug info on SILInstructions into a method on SILInstruction.
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.
2021-05-19 19:07:15 -07:00

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");
}