diff options
author | Oxore <oxore@protonmail.com> | 2023-05-27 18:10:42 +0300 |
---|---|---|
committer | Oxore <oxore@protonmail.com> | 2023-05-27 18:12:31 +0300 |
commit | a4841d2a593f9efed1cb116137034c307c1d74bc (patch) | |
tree | ee0e850b39f6b7dfe1532835409d88e2e33156ef /disasm.cpp | |
parent | edfe901ba751f4fcdf287102037eb36bf28cfa2a (diff) |
Impl -fshort-ref-local-labels, refactor feature parsing
Diffstat (limited to 'disasm.cpp')
-rw-r--r-- | disasm.cpp | 37 |
1 files changed, 27 insertions, 10 deletions
@@ -1822,6 +1822,7 @@ int Arg::SNPrint( const size_t bufsz, const bool imm_as_hex, const RefKindMask ref_kinds, + const char *const label, const uint32_t self_addr, const uint32_t ref_addr) const { @@ -1857,11 +1858,11 @@ int Arg::SNPrint( const char c = type == ArgType::kLong ? 'l' : 'w'; if (ref_kinds & kRefAbsMask) { if (static_cast<uint32_t>(lword) == ref_addr) { - return snprintf(buf, bufsz, "L%08x:%c", ref_addr, c); + return snprintf(buf, bufsz, "%s:%c", label, c); } else { // It has to be AFTER the label we are gonna reference here assert(static_cast<uint32_t>(lword) > ref_addr); - return snprintf(buf, bufsz, "L%08x+%d:%c", ref_addr, lword - ref_addr, c); + return snprintf(buf, bufsz, "%s+%d:%c", label, lword - ref_addr, c); } } else { return snprintf(buf, bufsz, "0x%x:%c", lword, c); @@ -1874,10 +1875,10 @@ int Arg::SNPrint( const bool has_fix = ref_kinds & kRefPcRelFix2Bytes; const uint32_t arg_addr = self_addr + d16_pc.d16 + kInstructionSizeStepBytes + (has_fix ? kInstructionSizeStepBytes : 0); if (arg_addr == ref_addr) { - return snprintf(buf, bufsz, "%%pc@(L%08x:w)", ref_addr); + return snprintf(buf, bufsz, "%%pc@(%s:w)", label); } else { assert(arg_addr > ref_addr); - return snprintf(buf, bufsz, "%%pc@(L%08x+%d:w)", ref_addr, arg_addr - ref_addr); + return snprintf(buf, bufsz, "%%pc@(%s+%d:w)", label, arg_addr - ref_addr); } } else { return snprintf(buf, bufsz, "%%pc@(%d:w)", d16_pc.d16); @@ -1892,11 +1893,11 @@ int Arg::SNPrint( case ArgType::kImmediate: if (ref_kinds & kRef1ImmMask) { if (static_cast<uint32_t>(lword) == ref_addr) { - return snprintf(buf, bufsz, "#L%08x", ref_addr); + return snprintf(buf, bufsz, "#%s", label); } else { // It has to be AFTER the label we are gonna reference here assert(static_cast<uint32_t>(lword) > ref_addr); - return snprintf(buf, bufsz, "#L%08x+%d", ref_addr, lword - ref_addr); + return snprintf(buf, bufsz, "#%s+%d", label, lword - ref_addr); } } else if (imm_as_hex) { return snprintf(buf, bufsz, "#0x%x", lword); @@ -1909,10 +1910,10 @@ int Arg::SNPrint( case ArgType::kDisplacement: if (ref_kinds & kRefRelMask) { if (static_cast<uint32_t>(self_addr + lword) == ref_addr) { - return snprintf(buf, bufsz, "L%08x", ref_addr); + return snprintf(buf, bufsz, "%s", label); } else { assert(static_cast<uint32_t>(self_addr + lword) > ref_addr); - return snprintf(buf, bufsz, "L%08x+%d", ref_addr, (self_addr + lword) - ref_addr); + return snprintf(buf, bufsz, "%s+%d", label, (self_addr + lword) - ref_addr); } } else { return snprintf(buf, bufsz, ".%s%d", lword >= 0 ? "+" : "", lword); @@ -1932,6 +1933,8 @@ int Op::FPrint( FILE *const stream, const char *const indent, const RefKindMask ref_kinds, + const char *const ref1_label, + const char *const ref2_label, const uint32_t self_addr, const uint32_t ref1_addr, const uint32_t ref2_addr) const @@ -1950,11 +1953,25 @@ int Op::FPrint( arg2.type == ArgType::kAn || arg2.type == ArgType::kCCR || arg2.type == ArgType::kSR; - arg1.SNPrint(arg1_str, kArgsBufferSize, imm_as_hex, ref1_kinds, self_addr, ref1_addr); + arg1.SNPrint( + arg1_str, + kArgsBufferSize, + imm_as_hex, + ref1_kinds, + ref1_label, + self_addr, + ref1_addr); if (arg2.type != ArgType::kNone) { char arg2_str[kArgsBufferSize]{}; const RefKindMask ref2_kinds = ref_kinds & (kRef2Mask | kRefPcRelFix2Bytes); - arg2.SNPrint(arg2_str, kArgsBufferSize, false, ref2_kinds, self_addr, ref2_addr); + arg2.SNPrint( + arg2_str, + kArgsBufferSize, + false, + ref2_kinds, + ref2_label, + self_addr, + ref2_addr); return fprintf(stream, "%s%s %s,%s", indent, mnemonic_str, arg1_str, arg2_str); } else { return fprintf(stream, "%s%s %s", indent, mnemonic_str, arg1_str); |