[LLVMdev] How can I output assembly comments from emitPrologue()?

Devang Patel dpatel at apple.com
Mon Nov 28 09:26:21 PST 2011


On Nov 20, 2011, at 8:13 AM, Stephen McGruer wrote:

> So, an update. I have managed to generate comments, although it does create a non-existent instruction. My method is as follows (and I would appreciate any comments on how to do it "better", although note that this won't make it into the final code :).)
> 
> 1. I declared a "fake" instruction type to hold comments, ala:
> 
> class FakeInst<dag outs, dag ins, string asmstr, list<dag> pattern> : Instruction {
>   field bits<32> Inst;
> 
>   let Namespace = "XXX"
>   let Inst{31-0} = 0;
> 
>   dag OutOperandList = outs;
>   dag InOperandList = ins;
>   let AsmString = asmstr;
>   let Pattern = pattern;
> }
> 
> 2. I then defined a comment instruction, ala:
> 
> def COMMENT : FakeInst<(outs), (ins Reg:$fake), "; $fake", []>;
> 
> 3. I added the following to printOperand(...) in XXXAsmPrinter.cpp:
> 
> switch (MO.getType()) {
>   ...
>   case MachineOperand::MO_Metadata:
>     O << cast<MDString>(MO.getMetadata()->getOperand(0))->getString();
>     break;
>   ...
> }
> 
> 4. Finally, whenever I needed to emit comments I call the following:
> 
> MDNode* comment = MDNode::get(getGlobalContext(), ArrayRef<Value*>(MDString::get(getGlobalContext(), "COMMENT HERE")));
> BuildMI(MBB, MBBI, dl, TII.get(XXX::COMMENT)).addMetadata(comment);
> 
> 
> 
> So, this seems to work, although it will create an empty instruction (I think). That could probably be cleaned up before MC emission, but I would really just remove the comments anyway. Any suggestions on a better way to do this (or a pointer to some obvious existing solution!) welcome :).

You don't need to create new fake instruction. You can attach your comment to any existing machine instruction.

	MI->addOperand(MachineOperand::CreateMetadata(comment));

-
Devang




More information about the llvm-dev mailing list