Skip to content

Commit 54693b4

Browse files
author
Morten Borup Petersen
committed
Use processor-provided ISA for assembler construction
Previously, the "full" ISA of a processor would have been used to construct the assembler. This, in turn, made it so that even disabled ISA extensions of the processor were enabled in the assembler.
1 parent 8c3783f commit 54693b4

File tree

12 files changed

+29
-30
lines changed

12 files changed

+29
-30
lines changed

src/assembler/assembler.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,18 @@ namespace Ripes {
44
namespace Assembler {
55

66
std::shared_ptr<AssemblerBase>
7-
constructAssemblerDynamic(const std::shared_ptr<const ISAInfoBase> &isa) {
8-
if (auto rv32isa =
9-
std::dynamic_pointer_cast<const ISAInfo<ISA::RV32I>>(isa)) {
7+
constructAssemblerDynamic(std::shared_ptr<ISAInfoBase> isa) {
8+
if (auto rv32isa = std::dynamic_pointer_cast<ISAInfo<ISA::RV32I>>(isa)) {
109
return std::make_shared<ISA_Assembler<ISA::RV32I>>(rv32isa);
1110
} else if (auto rv64isa =
12-
std::dynamic_pointer_cast<const ISAInfo<ISA::RV64I>>(isa)) {
11+
std::dynamic_pointer_cast<ISAInfo<ISA::RV64I>>(isa)) {
1312
return std::make_shared<ISA_Assembler<ISA::RV64I>>(rv64isa);
1413
}
1514

1615
throw std::runtime_error(
1716
std::string("Cannot dynamically construct assembler for isa: ") +
1817
isa->name().toStdString());
18+
return {};
1919
}
2020

2121
} // namespace Assembler

src/assembler/assembler.h

+5-6
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ class Assembler : public AssemblerBase {
6666
"Register type must be integer");
6767

6868
public:
69-
explicit Assembler(std::shared_ptr<const ISAInfoBase> isa) : m_isa(isa) {}
69+
explicit Assembler(std::shared_ptr<ISAInfoBase> isa) : m_isa(isa) {}
7070

7171
AssembleResult
7272
assemble(const QStringList &programLines, const SymbolMap *symbols = nullptr,
@@ -645,15 +645,15 @@ class Assembler : public AssemblerBase {
645645

646646
std::unique_ptr<Matcher> m_matcher;
647647

648-
std::shared_ptr<const ISAInfoBase> m_isa;
648+
std::shared_ptr<ISAInfoBase> m_isa;
649649
};
650650

651651
/// An Assembler and QObject (workaround because QObject cannot be directly
652652
/// subclassed by ISA_Assembler)
653653
class QAssembler : public QObject, public Assembler {
654654
Q_OBJECT
655655
public:
656-
QAssembler(std::shared_ptr<const ISAInfoBase> isaInfo) : Assembler(isaInfo) {
656+
QAssembler(std::shared_ptr<ISAInfoBase> isaInfo) : Assembler(isaInfo) {
657657
// Initialize segment pointers and monitor settings changes to segment
658658
// pointers
659659
connect(RipesSettings::getObserver(RIPES_SETTING_ASSEMBLER_TEXTSTART),
@@ -677,8 +677,7 @@ class QAssembler : public QObject, public Assembler {
677677
/// An ISA-specific assembler
678678
template <ISA isa>
679679
struct ISA_Assembler : public QAssembler {
680-
ISA_Assembler(std::shared_ptr<const ISAInfo<isa>> isaInfo)
681-
: QAssembler(isaInfo) {
680+
ISA_Assembler(std::shared_ptr<ISAInfoBase> isaInfo) : QAssembler(isaInfo) {
682681
initialize(gnuDirectives());
683682
}
684683

@@ -691,7 +690,7 @@ struct ISA_Assembler : public QAssembler {
691690
/// Returns an assembler for isa
692691
/// Throws a runtime error if the isa does not have a matching assembler
693692
std::shared_ptr<AssemblerBase>
694-
constructAssemblerDynamic(const std::shared_ptr<const ISAInfoBase> &isa);
693+
constructAssemblerDynamic(std::shared_ptr<ISAInfoBase> isa);
695694

696695
} // namespace Assembler
697696

src/processorhandler.cpp

+2-4
Original file line numberDiff line numberDiff line change
@@ -266,10 +266,8 @@ void ProcessorHandler::_toggleBreakpoint(const AInt address) {
266266
void ProcessorHandler::_clearBreakpoints() { m_breakpoints.clear(); }
267267

268268
void ProcessorHandler::createAssemblerForCurrentISA() {
269-
const auto &isa = m_currentProcessor->fullISA();
270-
if (!m_currentAssembler || m_currentAssembler->getISA() != isa->isaID()) {
271-
m_currentAssembler = Assembler::constructAssemblerDynamic(isa);
272-
}
269+
m_currentAssembler =
270+
Assembler::constructAssemblerDynamic(m_currentProcessor->implementsISA());
273271
}
274272

275273
void ProcessorHandler::_reset() {

src/processorhandler.h

+4-2
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,9 @@ class ProcessorHandler : public QObject {
5454
}
5555

5656
/// Returns a pointer to the currently instantiated ISA.
57-
static const ISAInfoBase *currentISA() { return get()->_currentISA(); }
57+
static std::shared_ptr<ISAInfoBase> currentISA() {
58+
return get()->_currentISA();
59+
}
5860

5961
/// Returns a pointer to the current ISA with all its supported extensions
6062
/// enabled.
@@ -292,7 +294,7 @@ private slots:
292294
}
293295
const ProcessorID &_getID() const { return m_currentID; }
294296
std::shared_ptr<const Program> _getProgram() const { return m_program; }
295-
const ISAInfoBase *_currentISA() const {
297+
std::shared_ptr<ISAInfoBase> _currentISA() const {
296298
return m_currentProcessor->implementsISA();
297299
}
298300
std::shared_ptr<const ISAInfoBase> _fullISA() const {

src/processors/RISC-V/rv5s/rv5s.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -512,8 +512,8 @@ class RV5S : public RipesVSRTLProcessor {
512512
}
513513

514514
static ProcessorISAInfo supportsISA() { return RVISA::supportsISA<XLEN>(); }
515-
const ISAInfoBase *implementsISA() const override {
516-
return m_enabledISA.get();
515+
std::shared_ptr<ISAInfoBase> implementsISA() const override {
516+
return m_enabledISA;
517517
}
518518
std::shared_ptr<const ISAInfoBase> fullISA() const override {
519519
return RVISA::fullISA<XLEN>();

src/processors/RISC-V/rv5s_no_fw/rv5s_no_fw.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -486,8 +486,8 @@ class RV5S_NO_FW : public RipesVSRTLProcessor {
486486
}
487487

488488
static ProcessorISAInfo supportsISA() { return RVISA::supportsISA<XLEN>(); }
489-
const ISAInfoBase *implementsISA() const override {
490-
return m_enabledISA.get();
489+
std::shared_ptr<ISAInfoBase> implementsISA() const override {
490+
return m_enabledISA;
491491
}
492492
std::shared_ptr<const ISAInfoBase> fullISA() const override {
493493
return RVISA::fullISA<XLEN>();

src/processors/RISC-V/rv5s_no_fw_hz/rv5s_no_fw_hz.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -436,8 +436,8 @@ class RV5S_NO_FW_HZ : public RipesVSRTLProcessor {
436436
}
437437

438438
static ProcessorISAInfo supportsISA() { return RVISA::supportsISA<XLEN>(); }
439-
const ISAInfoBase *implementsISA() const override {
440-
return m_enabledISA.get();
439+
std::shared_ptr<ISAInfoBase> implementsISA() const override {
440+
return m_enabledISA;
441441
}
442442
std::shared_ptr<const ISAInfoBase> fullISA() const override {
443443
return RVISA::fullISA<XLEN>();

src/processors/RISC-V/rv5s_no_hz/rv5s_no_hz.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -471,8 +471,8 @@ class RV5S_NO_HZ : public RipesVSRTLProcessor {
471471
}
472472

473473
static ProcessorISAInfo supportsISA() { return RVISA::supportsISA<XLEN>(); }
474-
const ISAInfoBase *implementsISA() const override {
475-
return m_enabledISA.get();
474+
std::shared_ptr<ISAInfoBase> implementsISA() const override {
475+
return m_enabledISA;
476476
}
477477
std::shared_ptr<const ISAInfoBase> fullISA() const override {
478478
return RVISA::fullISA<XLEN>();

src/processors/RISC-V/rv6s_dual/rv6s_dual.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -880,8 +880,8 @@ class RV6S_DUAL : public RipesVSRTLProcessor {
880880
}
881881

882882
static ProcessorISAInfo supportsISA() { return RVISA::supportsISA<XLEN>(); }
883-
const ISAInfoBase *implementsISA() const override {
884-
return m_enabledISA.get();
883+
std::shared_ptr<ISAInfoBase> implementsISA() const override {
884+
return m_enabledISA;
885885
}
886886
std::shared_ptr<const ISAInfoBase> fullISA() const override {
887887
return RVISA::fullISA<XLEN>();

src/processors/RISC-V/rvss/rvss.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -238,8 +238,8 @@ class RVSS : public RipesVSRTLProcessor {
238238
}
239239

240240
static ProcessorISAInfo supportsISA() { return RVISA::supportsISA<XLEN>(); }
241-
const ISAInfoBase *implementsISA() const override {
242-
return m_enabledISA.get();
241+
std::shared_ptr<ISAInfoBase> implementsISA() const override {
242+
return m_enabledISA;
243243
}
244244
std::shared_ptr<const ISAInfoBase> fullISA() const override {
245245
return RVISA::fullISA<XLEN>();

src/processors/interface/ripesprocessor.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ class RipesProcessor {
169169
* @brief implementsISA
170170
* @return ISA (+extensions) which the _instantiated_ processor implements.
171171
*/
172-
virtual const ISAInfoBase *implementsISA() const = 0;
172+
virtual std::shared_ptr<ISAInfoBase> implementsISA() const = 0;
173173

174174
/**
175175
* @brief fullISA

test/tst_riscv.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ QString tst_RISCV::dumpRegs() {
116116
QString::number(
117117
ProcessorHandler::getProcessor()->getPcForStage({0, 0}), 16) +
118118
"\n";
119-
const auto *isa = ProcessorHandler::currentISA();
119+
auto isa = ProcessorHandler::currentISA();
120120
for (const auto &regFile : isa->regInfos()) {
121121
for (unsigned i = 0; i < regFile->regCnt(); i++) {
122122
const auto value = ProcessorHandler::getProcessor()->getRegister(

0 commit comments

Comments
 (0)