[LLVMdev] [cfe-dev] LLVM Backend for Z80

Jonas Gefele llvm.org at schrieb.de
Tue Apr 17 23:50:51 PDT 2012


Hi Peter,

(I'm CC'ing the LLVMdev list as there might be others able to help you)


I don't know this assertion, so can't help you with that particular problem.
But concerning "more debug info": Do you know the following two links?

http://llvm.org/releases/3.0/docs/ProgrammersManual.html#DEBUG
You can find some example debug code e.g. in method Select(SDNode *Node)
in source file lib/Target/MSP430/MSP430ISelDAGToDAG.cpp 

http://llvm.org/releases/3.0/docs/ProgrammersManual.html#ViewGraph
(and the -view… options in http://llvm.org/releases/3.0/docs/CodeGenerator.html#selectiondag_process)
This takes some minimal effort to setup but is incredibly useful:
Run llc with all -view… options on. This will get you a first idea on where the problem occurs.
Then if you find the causing SelectionDAG pass, let's say your Select method in Z80IselDAGToDAG,
then you can set a breakpoint there and watch the state of the selection DAG on each iteration
via CurDAG->viewGraph().

Maybe that gives you an idea where the problem could be.

Cheers,
Jonas



Am 16.04.2012 um 12:51 schrieb Peter Hanzel:

> Hello.
> 
> I am playing with LLVM and trying to create Zilog Z80 Backend.
> I have succesfully created basic infrastructure and now trying to extend Z80InstrInfo.td to handle more and more C code.
> I have done some work with FrameIndex and now I am stuck with assert.
> 
> llc: SelectionDAG.cpp:645: bool llvm::SelectionDAG::RemoveNodeFromCSEMaps(llvm::SDNode*): Assertion `N->getOpcode() != ISD::EntryToken && "EntryToken in CSEMap!"' failed.
> 
> This code works:
> 
> void simple()
> {
> unsigned char i=10;
> unsigned char a = 20;
> }
> 
> and produces my somewhat not VERY REAL z80 assembly:
> 
> .file "simple.bc"
> .text
> .globl simple
> .type simple, at function
> simple:                                 # @simple
> # BB#0:                                 # %entry
> ld HL, SP+5
> ld (SP+0), HL
> ld HL, SP+4
> ld (SP+2), HL
> ld HL, (SP+0)
> ld (HL),10
> ld HL, (SP+2)
> ld (HL),20
> $tmp0:
> .size simple, ($tmp0)-simple
> 
> But when I add one line to c:
> 
> void simple()
> {
> unsigned char i=10;
> unsigned char a = 20;
> a = a+i;
> }
> 
> the llc fails to generate .S file.
> I have only added this instruction to Z80InstrInfo.td
> 
> def STORE16_trunc: Z80Instr<(outs), (ins GPR16:$src, GPR16:$dst),
> "ld_b ($dst),$src",
> [(truncstorei8 GPR16:$src, GPR16:$dst)]>;
> 
> This is also MY PSEUDO instruction on Z80.
> Next I will try to handle this is real instructions, but for now I cannot make futher due to that assertions.
> Attached is my whole code + test files.
> 
> I have tried to debug but the breakpoints and showing SDNodes deesn't helped me too much.
> I have observed that it is truying to remove EntryToken from proccess, but I can't figure what is in that EntryToken. According to llvm source code
> EntryToken is marker used to indicate the start of the region.
> 
> Is there any magic option to get some more debug info, what is going on. And why it tries to remove EntryToken?
> 
> Thanks, Peter.
> 
> 
> 
> <llvm_to_send.tgz>_______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev





More information about the llvm-dev mailing list