diff --git a/include/revng/EarlyFunctionAnalysis/CFGHelpers.h b/include/revng/EarlyFunctionAnalysis/CFGHelpers.h index f69a0464f..208325fb2 100644 --- a/include/revng/EarlyFunctionAnalysis/CFGHelpers.h +++ b/include/revng/EarlyFunctionAnalysis/CFGHelpers.h @@ -39,6 +39,7 @@ inline ParsedSuccessor parseSuccessor(const T &Edge, case FunctionEdgeType::Return: case FunctionEdgeType::BrokenReturn: case FunctionEdgeType::LongJmp: + case FunctionEdgeType::Unexpected: case FunctionEdgeType::Unreachable: return ParsedSuccessor{ .NextInstructionAddress = Edge.Destination(), .OptionalCallAddress = MetaAddress::invalid() }; diff --git a/include/revng/EarlyFunctionAnalysis/FunctionEdgeType.h b/include/revng/EarlyFunctionAnalysis/FunctionEdgeType.h index b5d237cf9..008a09ce6 100644 --- a/include/revng/EarlyFunctionAnalysis/FunctionEdgeType.h +++ b/include/revng/EarlyFunctionAnalysis/FunctionEdgeType.h @@ -25,6 +25,7 @@ inline bool isCall(Values V) { case BrokenReturn: case LongJmp: case Killer: + case Unexpected: case Unreachable: return false; } diff --git a/include/revng/EarlyFunctionAnalysis/efa-schema.yml b/include/revng/EarlyFunctionAnalysis/efa-schema.yml index 35b093fbf..83a71d1eb 100644 --- a/include/revng/EarlyFunctionAnalysis/efa-schema.yml +++ b/include/revng/EarlyFunctionAnalysis/efa-schema.yml @@ -135,3 +135,5 @@ definitions: doc: A killer basic block (killer syscall or endless loop) - name: Unreachable doc: The basic block ends with an unreachable instruction + - name: Unexpected + doc: The destination of this basic block is corrupted. This is a sign of a lifting error. diff --git a/include/revng/Yield/FunctionEdgeType.h b/include/revng/Yield/FunctionEdgeType.h index 20d805446..2028f6fd6 100644 --- a/include/revng/Yield/FunctionEdgeType.h +++ b/include/revng/Yield/FunctionEdgeType.h @@ -27,6 +27,7 @@ inline bool isCall(Values V) { case BrokenReturn: case LongJmp: case Killer: + case Unexpected: case Unreachable: return false; } @@ -50,6 +51,8 @@ inline Values from(efa::FunctionEdgeType::Values V) { return LongJmp; case efa::FunctionEdgeType::Killer: return Killer; + case efa::FunctionEdgeType::Unexpected: + return Unexpected; case efa::FunctionEdgeType::Unreachable: return Unreachable; } diff --git a/include/revng/Yield/yield-internal-schema.yml b/include/revng/Yield/yield-internal-schema.yml index 48c053d7b..6b332a5e5 100644 --- a/include/revng/Yield/yield-internal-schema.yml +++ b/include/revng/Yield/yield-internal-schema.yml @@ -156,6 +156,8 @@ definitions: doc: A killer basic block (killer syscall or endless loop) - name: Unreachable doc: The basic block ends with an unreachable instruction + - name: Unexpected + doc: The destination of this basic block is corrupted. This is a sign of a lifting error. - name: Instruction type: struct diff --git a/lib/EarlyFunctionAnalysis/CFGAnalyzer.cpp b/lib/EarlyFunctionAnalysis/CFGAnalyzer.cpp index 7fdb3b351..f0221ab97 100644 --- a/lib/EarlyFunctionAnalysis/CFGAnalyzer.cpp +++ b/lib/EarlyFunctionAnalysis/CFGAnalyzer.cpp @@ -363,9 +363,9 @@ CFGAnalyzer::collectDirectCFG(OutlinedFunction *OF) { // successor of the current basic block. revng_log(Log, "No other successors other than UnexpectedPC, emitting " - "LongJmp"); + "Unexpected"); auto Edge = makeEdge(BasicBlockID::invalid(), - efa::FunctionEdgeType::LongJmp); + efa::FunctionEdgeType::Unexpected); Block.Successors().insert(Edge); } } diff --git a/lib/EarlyFunctionAnalysis/ControlFlowGraph.cpp b/lib/EarlyFunctionAnalysis/ControlFlowGraph.cpp index 288a269d9..36eca26a2 100644 --- a/lib/EarlyFunctionAnalysis/ControlFlowGraph.cpp +++ b/lib/EarlyFunctionAnalysis/ControlFlowGraph.cpp @@ -350,6 +350,7 @@ bool FunctionEdgeBase::verify(model::VerifyHelper &VH) const { case BrokenReturn: case LongJmp: case Killer: + case Unexpected: case Unreachable: if (Destination().isValid()) return VH.fail("Unexpected destination, please use `:Invalid`."); diff --git a/lib/FunctionIsolation/IsolateFunctions.cpp b/lib/FunctionIsolation/IsolateFunctions.cpp index 140fdf119..b44b89733 100644 --- a/lib/FunctionIsolation/IsolateFunctions.cpp +++ b/lib/FunctionIsolation/IsolateFunctions.cpp @@ -695,6 +695,9 @@ void IsolateFunctionsImpl::handleAnyPCJumps(efa::OutlinedFunction &Outlined, AtLeastAMatch = true; switch (Edge->Type()) { + case efa::FunctionEdgeType::Unexpected: + // Ignore + continue; case efa::FunctionEdgeType::Return: Builder.CreateRetVoid(); break;