llvm-project/llvm/lib/DWARFCFIChecker/DWARFCFIFunctionFrameAnalyzer.cpp
AmirHossein PashaeeHir db03408b24
Minimal unwinding information (DWARF CFI) checker (#145633)
This PR adds a minimal version of `UnwindInfoChecker` described in
[here](https://discourse.llvm.org/t/rfc-dwarf-cfi-validation/86936).

This implementation looks into the modified registers by each
instruction and checks:
- If one of them is the CFA register, and it informs the user if the CFA
data is not modified as well.
- If one of them is used in another register's unwinding rule, it
informs the user if the unwind info is not modified after this
instruction.

This implementation does not support DWARF expressions and treats them
as unknown unwinding rules.
2025-07-08 18:36:56 -07:00

34 lines
1.2 KiB
C++

//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "llvm/DWARFCFIChecker/DWARFCFIFunctionFrameAnalyzer.h"
using namespace llvm;
CFIFunctionFrameAnalyzer::~CFIFunctionFrameAnalyzer() {
assert(UIAs.empty() &&
"all frames should be closed before the analysis finishes");
}
void CFIFunctionFrameAnalyzer::startFunctionFrame(
bool IsEH, ArrayRef<MCCFIInstruction> Prologue) {
UIAs.emplace_back(&getContext(), MCII, IsEH, Prologue);
}
void CFIFunctionFrameAnalyzer::emitInstructionAndDirectives(
const MCInst &Inst, ArrayRef<MCCFIInstruction> Directives) {
assert(!UIAs.empty() && "if the instruction is in a frame, there should be "
"a analysis instantiated for it");
UIAs.back().update(Inst, Directives);
}
void CFIFunctionFrameAnalyzer::finishFunctionFrame() {
assert(!UIAs.empty() && "there should be an analysis for each frame");
UIAs.pop_back();
}