Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion arch/RISCV/RISCVInstPrinter.c
Original file line number Diff line number Diff line change
Expand Up @@ -374,6 +374,8 @@ void RISCV_LLVM_printInstruction(MCInst *MI, SStream *O,
MI->MRI = (MCRegisterInfo *)info;

MCInst_setIsAlias(MI, false);
bool usesAliasDetails = map_use_alias_details(MI);
MI->flat_insn->usesAliasDetails = usesAliasDetails;

/* check for a non-compressed instruction */
MCInst Uncompressed;
Expand Down Expand Up @@ -404,7 +406,7 @@ void RISCV_LLVM_printInstruction(MCInst *MI, SStream *O,
if (printAliasInstr(McInstr, MI->address, O)) {
MCInst_setIsAlias(MI, true);
// do we still want the exact details even if the text is alias ?
if (!map_use_alias_details(MI) && detail_is_set(MI)) {
if (!usesAliasDetails && detail_is_set(MI)) {
// disable actual printing
SStream_Close(O);
// discard the alias operands
Expand Down
3 changes: 3 additions & 0 deletions suite/cstest/include/test_case.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ typedef struct {
char *asm_text; // mandatory
char *op_str;
tbool is_alias;
tbool uses_alias_details;
tbool illegal;
uint32_t size;
char *alias_id;
Expand All @@ -83,6 +84,8 @@ static const cyaml_schema_field_t test_insn_data_mapping_schema[] = {
TestInsnData, op_str, 0, CYAML_UNLIMITED),
CYAML_FIELD_INT("is_alias", CYAML_FLAG_OPTIONAL, TestInsnData,
is_alias),
CYAML_FIELD_INT("uses_alias_details", CYAML_FLAG_OPTIONAL, TestInsnData,
uses_alias_details),
CYAML_FIELD_INT("illegal", CYAML_FLAG_OPTIONAL, TestInsnData, illegal),
CYAML_FIELD_UINT("size", CYAML_FLAG_OPTIONAL, TestInsnData, size),
CYAML_FIELD_STRING_PTR("alias_id",
Expand Down
2 changes: 2 additions & 0 deletions suite/cstest/include/test_mapping.h
Original file line number Diff line number Diff line change
Expand Up @@ -1454,7 +1454,9 @@ static const cs_enum_id_map cs_enum_map[] = {
{ .str = "RISCV_INS_ALIAS_CV_MULHHU",
.val = RISCV_INS_ALIAS_CV_MULHHU },
{ .str = "RISCV_INS_ALIAS_NOP", .val = RISCV_INS_ALIAS_NOP },
{ .str = "RISCV_INS_ALIAS_RET", .val = RISCV_INS_ALIAS_RET },
{ .str = "RISCV_INS_CV_MULHHUN", .val = RISCV_INS_CV_MULHHUN },
{ .str = "RISCV_INS_JALR", .val = RISCV_INS_JALR },
{ .str = "RISCV_INS_ZIP", .val = RISCV_INS_ZIP },
{ .str = "RISCV_OP_CSR", .val = RISCV_OP_CSR },
{ .str = "RISCV_OP_FP", .val = RISCV_OP_FP },
Expand Down
47 changes: 25 additions & 22 deletions suite/cstest/src/test_case.c
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ TestInsnData *test_insn_data_clone(TestInsnData *test_insn_data)
NULL;
tid->id = test_insn_data->id ? cs_strdup(test_insn_data->id) : NULL;
tid->is_alias = test_insn_data->is_alias;
tid->uses_alias_details = test_insn_data->uses_alias_details;
tid->illegal = test_insn_data->illegal;
tid->size = test_insn_data->size;
tid->mnemonic = test_insn_data->mnemonic ?
Expand Down Expand Up @@ -251,6 +252,21 @@ void test_expected_compare(csh *handle, TestExpected *expected, cs_insn *insns,
cs_free(insns, insns_count); \
fail_msg(msg);

#define CS_CHECK_TBOOL(expected, actual, true_msg, false_msg) \
do { \
if ((expected) != 0) { \
if ((expected) > 0) { \
if (!(actual)) { \
CS_TEST_FAIL(true_msg); \
} \
} else { \
if ((actual)) { \
CS_TEST_FAIL(false_msg); \
} \
} \
} \
} while (0)

if (!compare_asm_text(asm_text, expec_data->asm_text,
arch_bits)) {
CS_TEST_FAIL("asm-text mismatch\n");
Expand All @@ -262,28 +278,14 @@ void test_expected_compare(csh *handle, TestExpected *expected, cs_insn *insns,
CS_TEST_FAIL("ids mismatch");
}
}
if (expec_data->is_alias != 0) {
if (expec_data->is_alias > 0) {
if (!insns[i].is_alias) {
CS_TEST_FAIL("should be an alias");
}
} else {
if (insns[i].is_alias) {
CS_TEST_FAIL("should not be an alias");
}
}
}
if (expec_data->illegal != 0) {
if (expec_data->illegal > 0) {
if (!insns[i].illegal) {
CS_TEST_FAIL("should be illegal");
}
} else {
if (insns[i].illegal) {
CS_TEST_FAIL("should not be illegal");
}
}
}
CS_CHECK_TBOOL(expec_data->is_alias, insns[i].is_alias,
"should be an alias", "should not be an alias");
CS_CHECK_TBOOL(expec_data->uses_alias_details,
insns[i].usesAliasDetails,
"should use alias operands",
"should not use alias operands");
CS_CHECK_TBOOL(expec_data->illegal, insns[i].illegal,
"should be illegal", "should not be illegal");
if (expec_data->size) {
if (insns[i].size != expec_data->size) {
CS_TEST_FAIL("size mismatch");
Expand Down Expand Up @@ -316,6 +318,7 @@ void test_expected_compare(csh *handle, TestExpected *expected, cs_insn *insns,
}
}
#undef CS_TEST_FAIL
#undef CS_CHECK_TBOOL
}
}

Expand Down
30 changes: 30 additions & 0 deletions tests/issues/issues.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6453,3 +6453,33 @@ test_cases:
id: RISCV_INS_CV_MULHHUN
is_alias: 1
alias_id: RISCV_INS_ALIAS_CV_MULHHU
-
input:
name: "RISCV - #2896 - alias operand details (REAL)"
bytes: [ 0x67, 0x80, 0x00, 0x00 ]
arch: "CS_ARCH_RISCV"
options: [ CS_MODE_RISCV64, CS_OPT_DETAIL, CS_OPT_DETAIL_REAL ]
address: 0x0
expected:
insns:
-
asm_text: "ret"
id: RISCV_INS_JALR
is_alias: 1
alias_id: RISCV_INS_ALIAS_RET
uses_alias_details: -1
-
input:
name: "RISCV - #2896 - alias operand details (ALIAS)"
bytes: [ 0x67, 0x80, 0x00, 0x00 ]
arch: "CS_ARCH_RISCV"
options: [ CS_MODE_RISCV64, CS_OPT_DETAIL ]
address: 0x0
expected:
insns:
-
asm_text: "ret"
id: RISCV_INS_JALR
is_alias: 1
alias_id: RISCV_INS_ALIAS_RET
uses_alias_details: 1
Loading