From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 11511 invoked by alias); 11 Jun 2015 20:41:57 -0000 Mailing-List: contact jit-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Post: List-Help: List-Subscribe: Sender: jit-owner@gcc.gnu.org Received: (qmail 11493 invoked by uid 89); 11 Jun 2015 20:41:56 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Checked: by ClamAV 0.98.7 on sourceware.org X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.7 required=5.0 tests=AWL,BAYES_05,KAM_LAZY_DOMAIN_SECURITY,SPF_HELO_PASS,T_RP_MATCHES_RCVD autolearn=no version=3.3.2 X-Spam-Status: No, score=-0.7 required=5.0 tests=AWL,BAYES_05,KAM_LAZY_DOMAIN_SECURITY,SPF_HELO_PASS,T_RP_MATCHES_RCVD autolearn=no version=3.3.2 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on sourceware.org X-Spam-Level: X-HELO: mx1.redhat.com Message-ID: <1434054869.12727.207.camel@surprise> Subject: Re: Basic blocks, jump targets and locals From: David Malcolm To: Dibyendu Majumdar Cc: jit@gcc.gnu.org Date: Thu, 01 Jan 2015 00:00:00 -0000 In-Reply-To: <1434054685.12727.205.camel@surprise> References: <1434054685.12727.205.camel@surprise> Content-Type: text/plain; charset="UTF-8" Mime-Version: 1.0 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-SW-Source: 2015-q2/txt/msg00045.txt.bz2 On Thu, 2015-06-11 at 16:31 -0400, David Malcolm wrote: > On Thu, 2015-06-11 at 21:26 +0100, Dibyendu Majumdar wrote: > > Hi, > > > > In LLVM the IRBuilder has the concept of a current block where > > instructions are inserted. Reading the libgccjit docs I think that > > there is no notion of current block - i.e. this needs to be maintained > > by the caller - is that correct? > > Correct. > > > Can one create several blocks in advance - and set a block that is not > > yet inserted into the function as the target for a jump? > > Yes. See e.g.: > https://gcc.gnu.org/onlinedocs/jit/intro/tutorial04.html#populating-the-function > which does two passes: > (i) iterates through all of the bytecodes in a function, creating > gcc_jit_block instances for each one > (ii) iterates again, populating the gcc_jit_block instances with > statements > > > The scenario > > is this: when compiling Lua bytecode I already know all the jump > > targets. So I pre-create all the basic blocks that relate to the jump > > targets up front - and as each jump is encountered I can easily set > > the jump target to the right block. As and when I cross the bytecode > > that is a jump target the block gets added to the function. > > (nods) BTW, you may want to use gcc_jit_block_add_comment: https://gcc.gnu.org/onlinedocs/jit/topics/functions.html#gcc_jit_block_add_comment which lets you add arbitrary comments as "statements" into the libgccjit IR, so it shows up in the various debug dumps. I've found this to be hugely valuable when debugging compilation of bytecode into libgccjit. > > I hope above is clear - if not I can explain by an example. > > > > Can I do something similar with libgccjit? > > Hopefully the example above makes it clear. > > > Finally - how are local variable related to blocks. In LLVM one has to > > create the local vars in the entry block of the function. Is it the > > same with libgccjit? > > Local variables in libgccjit are local to a *function*; there's no > association between them and blocks. Blocks in libgccjit relate to > control flow, not to scope. > > Note that any initialization of a local variable has to be done > explicitly, by adding an assignment statement. Typically that > assignment statement would be added to the initial block, as in the > example above (so I suppose that's an association of sorts between > locals and the entry block). > > Hope this is clear > Dave >