I give up.

Andrew Haley aph@redhat.com
Wed Oct 22 15:08:00 GMT 2003


Jonathan Wilson writes:
 > > Such as... (yesterday) gen_rtx_REG?  That's in emit-rtl.c.  As for
 > > gen_rtx_UNSPEC, I don't know.  Bear in mind that there are about a dozen
 > > or so C files that are *generated* during the build.  Sometimes what
 > > you're looking for is in there instead, or in the generator program.
 > I did finally find all the bits of code (for example in genrtl.c).
 > But all that has done is made me even more confused as to just WTF all 
 > these functions are actually for.
 > 
 > What I am looking for is a "guide to emitting RTL in GCC on i?86 
 > processors". Or if such a thing doesnt exist, someone out there who knows 
 > how to do what it is that I am trying to do and can tell me.
 > Because after staring at the code, the docs, the (in this case) usless 
 > google search results and the back-postings to this list, I am still no 
 > closer to figuring out how functions like gen_rtx_UNSPEC, gen_rtx_CONST, 
 > gen_reg_rtx, gen_subsi3, emit_insn, gen_rtx_SET and so on actually transfer 
 > to the x86 assembler instructions that appear in the output thats fed to 
 > GAS :'(

Look at i386.c.  There's a ton of examples there, such as this one in
ix86_expand_epilogue :

	  rtx tmp, sa = EH_RETURN_STACKADJ_RTX;

	  if (frame_pointer_needed)
	    {
	      tmp = gen_rtx_PLUS (Pmode, hard_frame_pointer_rtx, sa);
	      tmp = plus_constant (tmp, UNITS_PER_WORD);
	      emit_insn (gen_rtx_SET (VOIDmode, sa, tmp));

	      tmp = gen_rtx_MEM (Pmode, hard_frame_pointer_rtx);
	      emit_move_insn (hard_frame_pointer_rtx, tmp);

	      emit_insn (gen_pro_epilogue_adjust_stack
			 (stack_pointer_rtx, sa, const0_rtx));
	    }
	  else
	    {
	      tmp = gen_rtx_PLUS (Pmode, stack_pointer_rtx, sa);
	      tmp = plus_constant (tmp, (frame.to_allocate
                                         + frame.nregs * UNITS_PER_WORD));
	      emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx, tmp));
	    }
	}

which generates code to adjust registers, read and write memory, and
so on.  emit_insn() pushes an insn into the insn stream, which is then
optimized and converted to assembler.

Segment registers are a bit tricky.

 > Normally, the usual response to "the docs, google and list archives" didnt 
 > help (when it comes to open source projects) is "go read the code".
 > However in this case, what is one supposed to do when you have already read 
 > the code and even that didnt help?

That's still true.

Andrew.




More information about the Gcc mailing list