2017-05-03 17 views
1

中疑似命令を発する、Iは実(非擬似)命令の緩和などの疑似命令を発するたい。問題は、の出力に適用されるように私のTargetPassConfigに擬似命令エキスパンダーパスを追加する方法を見つけることができないということです。LLVMバックエンドで緩和

リラクゼーション用のドライバであるように思われ、MCAssembler::relaxInstructionを見ると、それは命令エンコーダに直接緩和の結果を渡します。

bool MCAssembler::relaxInstruction(MCAsmLayout &Layout, 
            MCRelaxableFragment &F) { 
    if (!fragmentNeedsRelaxation(&F, Layout)) 
    return false; 

    ++stats::RelaxedInstructions; 

    // FIXME-PERF: We could immediately lower out instructions if we can tell 
    // they are fully resolved, to avoid retesting on later passes. 

    // Relax the fragment. 

    MCInst Relaxed; 
    getBackend().relaxInstruction(F.getInst(), F.getSubtargetInfo(), Relaxed); 

    // Encode the new instruction. 
    // 
    // FIXME-PERF: If it matters, we could let the target do this. It can 
    // probably do so more efficiently in many cases. 
    SmallVector<MCFixup, 4> Fixups; 
    SmallString<256> Code; 
    raw_svector_ostream VecOS(Code); 
    getEmitter().encodeInstruction(Relaxed, VecOS, Fixups, F.getSubtargetInfo()); 

    // Update the fragment. 
    F.setInst(Relaxed); 
    F.getContents() = Code; 
    F.getFixups() = Fixups; 

    return true; 
} 

私にとって、これは中に「自分で」私はあることを意味バックエンドのrelaxInstructionが擬似命令を発行しないようにします。だから私の擬似命令エキスパンダーパスを私のrelaxInstructionにつなぐには?

+0

。 – Cactus

答えて

1

ターゲットのCodeEmitter::encodeInstructionの内部では、通常、getBinaryCodeForInstrが呼び出されます。この呼び出しの前に、擬似命令を2つの実際の命令に拡張できますか? `relaxInstruction`は、単一のリラックスした命令を返し、私の擬似命令は、二つの実命令にdesugars、私はリラックス時に直接展開を放出することはできません。ただリラックス時に本当の指示を発することが明白な提案を先取りする

関連する問題