VLIW架构llvm-mc实现:MCCodeEmitter中如何从MCInst取调度单元?
从MCInst获取调度单元以校验VLIW指令顺序
问题场景
在为VLIW架构的下游编译器实现llvm-mc时,编码指令bundle前需要校验指令顺序是否合规,核心需求是从MCInst中提取对应的调度单元。参考Hexagon目标的实现,其HexagonInstrInfo::getUnits()方法依赖MachineInstr和TargetInstructionInfo,但在MCCodeEmitter中无法访问这些对象,仅能使用MCInst、MCSubtargetInfo、MCInstrInfo和MCContext。
实现方案
1. 从MCSubtargetInfo获取调度 itineraries
MCSubtargetInfo包含目标架构的调度配置信息,可直接从中获取InstrItineraryData:
const InstrItineraryData &II = Subtarget.getInstrItineraryData();
2. 通过MCInstrInfo获取指令调度类ID
利用MCInst的 opcode,从MCInstrInfo中拿到对应的MCInstrDesc,进而提取调度类ID:
const MCInstrDesc &Desc = MCII.get(Inst.getOpcode()); unsigned SchedClass = Desc.getSchedClass();
3. 提取目标调度单元
通过调度类ID从InstrItineraryData中定位对应的InstrStage,最终获取调度单元:
if (SchedClass != 0 && II.isValid()) { const InstrStage &IS = *II.beginStage(SchedClass); InstrStage::FuncUnits Units = IS.getUnits(); // 基于Units执行指令顺序校验逻辑 }
完整代码示例
InstrStage::FuncUnits getMCInstUnits(const MCInst &Inst, const MCSubtargetInfo &Subtarget, const MCInstrInfo &MCII) { const InstrItineraryData &II = Subtarget.getInstrItineraryData(); if (!II.isValid()) return InstrStage::FuncUnits(); // 返回空或默认调度单元 const MCInstrDesc &Desc = MCII.get(Inst.getOpcode()); unsigned SchedClass = Desc.getSchedClass(); if (SchedClass == 0) return InstrStage::FuncUnits(); const InstrStage &IS = *II.beginStage(SchedClass); return IS.getUnits(); }
内容的提问来源于stack exchange,提问作者totikom
相关产品推荐
相关产品推荐

