Return-Path: Delivered-To: apmail-harmony-dev-archive@www.apache.org Received: (qmail 583 invoked from network); 14 Dec 2009 18:15:29 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 14 Dec 2009 18:15:29 -0000 Received: (qmail 58151 invoked by uid 500); 14 Dec 2009 18:15:29 -0000 Delivered-To: apmail-harmony-dev-archive@harmony.apache.org Received: (qmail 58105 invoked by uid 500); 14 Dec 2009 18:15:28 -0000 Mailing-List: contact dev-help@harmony.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@harmony.apache.org Delivered-To: mailing list dev@harmony.apache.org Received: (qmail 58094 invoked by uid 99); 14 Dec 2009 18:15:28 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 14 Dec 2009 18:15:28 +0000 X-ASF-Spam-Status: No, hits=2.2 required=10.0 tests=HTML_MESSAGE,SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (nike.apache.org: domain of csabol@gmail.com designates 209.85.160.41 as permitted sender) Received: from [209.85.160.41] (HELO mail-pw0-f41.google.com) (209.85.160.41) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 14 Dec 2009 18:15:19 +0000 Received: by pwi7 with SMTP id 7so2262655pwi.20 for ; Mon, 14 Dec 2009 10:14:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:in-reply-to:references :date:message-id:subject:from:to:content-type; bh=vLWfHdAgAuuQLjdWvZMXrc5pEt2QR+6c4PTYONzY3Gs=; b=D9UbqZsvONg/DpePJ8Fnyaah2kN/4PjdmREWdFPYfFoYXTC3KnpLq202SUL9LZOS+2 ibz0JxFAcB+mxb86RuTxupDsMuLKkltwIzeqL/w1Co4NbrKRug15oHLfGy4gKTkk0kpc Z7yKBZj4p8FsNmXUCaJteHTcU+KG3jwNmEBME= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type; b=nsNFFdAdkxe2oYgqvyII+w1uKlpTPkAEOtyEtINHEcPMVt4yZCxIlxR3XQYfb9sIus 8JliU6brqKF2GGfc7ujENu0djcFTKtAjSFIm71XQiOQreFrA/Jj+J+oSxEKxXqaCgXST cvlSTzgCvfh1+NAoHV356XMRzT21KglUqbsxY= MIME-Version: 1.0 Received: by 10.115.102.9 with SMTP id e9mr3451111wam.199.1260814498447; Mon, 14 Dec 2009 10:14:58 -0800 (PST) In-Reply-To: <87tyvtzdg9.fsf@gmail.com> References: <008601ca7cbc$0877df50$19679df0$@edu.cn> <87tyvtzdg9.fsf@gmail.com> Date: Mon, 14 Dec 2009 10:14:58 -0800 Message-ID: <5be4369f0912141014i24cf665ene342e44ce59b8efd@mail.gmail.com> Subject: Re: How to debug in JET code generation? From: Christopher Sabol To: dev@harmony.apache.org Content-Type: multipart/mixed; boundary=0016e64f80704ec05f047ab440d3 X-Virus-Checked: Checked by ClamAV on apache.org --0016e64f80704ec05f047ab440d3 Content-Type: multipart/alternative; boundary=0016e64f80704ec056047ab440d1 --0016e64f80704ec056047ab440d1 Content-Type: text/plain; charset=ISO-8859-1 For what's its worth, on MIPS it did some hacking to validate the basic ALU operations before moving on to get the standard classes to initialize. If you look up the MIPS patch that Charles sent out, I believe it still contains my "SIMPLE_START" define hack. That define basically causes the DRLVM class initialization logic to not run a bunch of the standard initialization logic. I haven't gotten around to pulling it out yet... Anyhow, I've also attached the simple kernel.jar and class files that basically do a number of unit tests in the java.lang.Object() constructor. When combined with SIMPLE_START, you can validate the generated assembly and output without having to have everything working. There are a number of static native methods that the classes use to print output information, you can also get the implementation for those from the MIPS patch as well. Other than that I was using gdb a bunch and had the compile tracing turned on to validate the assembly. I was generally running drlvm with the following command line: java -Xem:jet -verbose -Xtrace:vm.core.init -Xtrace:init -Xtrace:em -Xtrace:invoke -Xtrace:compile -Xtrace:harmonyvm -Xtrace:class -Xtrace:natives -Xdumpstubs -XX:jit.JET.arg.log=ct,sum,cg,layout,code -Xtrace:jitrino -Xtrace:vm.stack -Xtrace:exn -Xtrace:vm.helpers -jar dummy Assuming you are running big endian, you may want to pick up the ENDIAN changes from the MIPS patch, since those will be needed and are a pain to find. -Chris On Mon, Dec 14, 2009 at 9:13 AM, Egor Pasko wrote: > On the 0x687 day of Apache Harmony pillow wrote: > > Hi all: > > > > We are new in Harmony porting work. > > > > Now we want to port harmony DRLVM's JET to Sparc. We have implemented > > encoder and Lil compiler for this > > wow, that's cool! what a surprise! > > > platform and go to code generation phase. > > > > We want some advice that how to debug here easily. > > GDB/DDD debugger should work fine on linux. Do you have some specific > problems to list here? > > > If we want to run a HelloWorld program out, is it necessary to > > pass all library classes compilation with JET first? > > Yes, absolutely. Hello World is written mostly in java, you will need > to compile a fair bunch of methods to run HelloWorld. > > -- > Egor Pasko > > --0016e64f80704ec056047ab440d1 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable For what's its worth, on MIPS it did some hacking to validate the basic= ALU operations before moving on to get the standard classes to initialize.= =A0

If you look up the MIPS patch that Charles sent out, I believe = it still contains my "SIMPLE_START" define hack.=A0 That define b= asically causes the DRLVM class initialization logic to not run a bunch of = the standard initialization logic.=A0=A0 I haven't gotten around to pul= ling it out yet...

Anyhow, I've also attached the simple kernel.jar and class files th= at basically do a number of unit tests in the java.lang.Object() constructo= r.=A0 When combined with SIMPLE_START, you can validate the generated assem= bly and output without having to have everything working.=A0 There are a nu= mber of static native methods that the classes use to print output informat= ion, you can also get the implementation for those from the MIPS patch as w= ell.

Other than that I was using gdb a bunch and had the compile tracing tur= ned on to validate the assembly.=A0 I was generally running drlvm with the = following command line:

java -Xem:jet -verbose -Xtrace:vm.core.init = -Xtrace:init -Xtrace:em -Xtrace:invoke -Xtrace:compile -Xtrace:harmonyvm -X= trace:class -Xtrace:natives -Xdumpstubs -XX:jit.JET.arg.log=3Dct,sum,cg,lay= out,code -Xtrace:jitrino -Xtrace:vm.stack -Xtrace:exn -Xtrace:vm.helpers -j= ar dummy

Assuming you are running big endian, you may want to pick up the ENDIAN= changes from the MIPS patch, since those will be needed and are a pain to = find.

-Chris

On Mon, Dec 14, 2009 = at 9:13 AM, Egor Pasko <egor.pasko@gmail.com> wrote:
On the 0x687 day of Apache Harmony pillow wrote:
> Hi all:
>
> We are new in Harmony porting work.
>
> Now we want to port harmony DRLVM's JET to Sparc. We have implemen= ted
> encoder and Lil compiler for this

wow, that's cool! what a surprise!

> platform and go to code generation phase.
>
> We want some advice that how to debug here easily.

GDB/DDD debugger should work fine on linux. Do you have some specific=
problems to list here?

> If we want to run a HelloWorld program out, is it necessary to
> pass all library classes compilation with JET first?

Yes, absolutely. Hello World is written mostly in java, you will need=
to compile a fair bunch of methods to run HelloWorld.

--
Egor Pasko


--0016e64f80704ec056047ab440d1-- --0016e64f80704ec05f047ab440d3 Content-Type: application/x-gzip; name="vmtest.tgz" Content-Disposition: attachment; filename="vmtest.tgz" Content-Transfer-Encoding: base64 X-Attachment-Id: f_g37k7ype0 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 --0016e64f80704ec05f047ab440d3--