mirror of
https://github.com/asmjit/asmjit.git
synced 2025-12-18 13:04:36 +03:00
[Bug] Fixed incorrect control flow information of 'b' instruction (AArch64) (Fixes #358)
This commit is contained in:
@@ -102,7 +102,7 @@ public:
|
|||||||
|
|
||||||
// TODO: [ARM] This is just a workaround...
|
// TODO: [ARM] This is just a workaround...
|
||||||
static InstControlFlow getControlFlowType(InstId instId) noexcept {
|
static InstControlFlow getControlFlowType(InstId instId) noexcept {
|
||||||
switch (instId) {
|
switch (BaseInst::extractRealId(instId)) {
|
||||||
case Inst::kIdB:
|
case Inst::kIdB:
|
||||||
case Inst::kIdBr:
|
case Inst::kIdBr:
|
||||||
if (BaseInst::extractARMCondCode(instId) == CondCode::kAL)
|
if (BaseInst::extractARMCondCode(instId) == CondCode::kAL)
|
||||||
@@ -127,8 +127,8 @@ static InstControlFlow getControlFlowType(InstId instId) noexcept {
|
|||||||
Error RACFGBuilder::onInst(InstNode* inst, InstControlFlow& controlType, RAInstBuilder& ib) noexcept {
|
Error RACFGBuilder::onInst(InstNode* inst, InstControlFlow& controlType, RAInstBuilder& ib) noexcept {
|
||||||
InstRWInfo rwInfo;
|
InstRWInfo rwInfo;
|
||||||
|
|
||||||
InstId instId = inst->id();
|
if (Inst::isDefinedId(inst->realId())) {
|
||||||
if (Inst::isDefinedId(instId)) {
|
InstId instId = inst->id();
|
||||||
uint32_t opCount = inst->opCount();
|
uint32_t opCount = inst->opCount();
|
||||||
const Operand* opArray = inst->operands();
|
const Operand* opArray = inst->operands();
|
||||||
ASMJIT_PROPAGATE(InstInternal::queryRWInfo(_arch, inst->baseInst(), opArray, opCount, &rwInfo));
|
ASMJIT_PROPAGATE(InstInternal::queryRWInfo(_arch, inst->baseInst(), opArray, opCount, &rwInfo));
|
||||||
|
|||||||
@@ -312,6 +312,10 @@ public:
|
|||||||
return id | (uint32_t(cc) << Support::ConstCTZ<uint32_t(InstIdParts::kARM_Cond)>::value);
|
return id | (uint32_t(cc) << Support::ConstCTZ<uint32_t(InstIdParts::kARM_Cond)>::value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline constexpr InstId extractRealId(uint32_t id) noexcept {
|
||||||
|
return id & uint32_t(InstIdParts::kRealId);
|
||||||
|
}
|
||||||
|
|
||||||
static inline constexpr arm::CondCode extractARMCondCode(uint32_t id) noexcept {
|
static inline constexpr arm::CondCode extractARMCondCode(uint32_t id) noexcept {
|
||||||
return (arm::CondCode)((uint32_t(id) & uint32_t(InstIdParts::kARM_Cond)) >> Support::ConstCTZ<uint32_t(InstIdParts::kARM_Cond)>::value);
|
return (arm::CondCode)((uint32_t(id) & uint32_t(InstIdParts::kARM_Cond)) >> Support::ConstCTZ<uint32_t(InstIdParts::kARM_Cond)>::value);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user