From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13741 invoked by alias); 19 Jun 2010 17:26:04 -0000 Received: (qmail 13705 invoked by uid 22791); 19 Jun 2010 17:25:59 -0000 X-SWARE-Spam-Status: No, hits=-1.9 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_PASS,TW_AV,TW_QE,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from smtp-out.google.com (HELO smtp-out.google.com) (74.125.121.35) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sat, 19 Jun 2010 17:25:49 +0000 Received: from kpbe14.cbf.corp.google.com (kpbe14.cbf.corp.google.com [172.25.105.78]) by smtp-out.google.com with ESMTP id o5JHPjmo012154 for ; Sat, 19 Jun 2010 10:25:45 -0700 Received: from gwj16 (gwj16.prod.google.com [10.200.10.16]) by kpbe14.cbf.corp.google.com with ESMTP id o5JHPF2a011139 for ; Sat, 19 Jun 2010 10:25:44 -0700 Received: by gwj16 with SMTP id 16so1531076gwj.31 for ; Sat, 19 Jun 2010 10:25:44 -0700 (PDT) MIME-Version: 1.0 Received: by 10.220.121.144 with SMTP id h16mr928305vcr.19.1276968341947; Sat, 19 Jun 2010 10:25:41 -0700 (PDT) Received: by 10.220.189.201 with HTTP; Sat, 19 Jun 2010 10:25:41 -0700 (PDT) In-Reply-To: References: <201006071700.28706.pedro@codesourcery.com> <4C19222C.2000208@codesourcery.com> <201006162016.18181.pedro@codesourcery.com> <4C19265B.7090502@codesourcery.com> <4C1A6362.3020306@vmware.com> Date: Sat, 19 Jun 2010 17:26:00 -0000 Message-ID: Subject: Re: [NEWS/RFA] Re: [gdbserver] x86 agent expression bytecode compiler (speed up conditional tracepoints) From: Doug Evans To: Hui Zhu Cc: "gdb-patches@sourceware.org" , Pedro Alves , Stan Shebs , Eli Zaretskii , "tromey@redhat.com" , Michael Snyder Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-System-Of-Record: true X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2010-06/txt/msg00430.txt.bz2 The fix to the compilation problem (for now) should be as trivial as applying Ian's suggested change. gcc doesn't optimize *inside* the asm statement. Now we just have to avoid things like mao. :-) [mao is a post-gcc assembly level optimizer, transmeta had another called caligula ...] On Sat, Jun 19, 2010 at 10:13 AM, Hui Zhu wrote: > Hi guys, > > I say something about bytecode compiler . > > I did some code work like it in skyeye dbct (dynamic binary code > translation) =A0in before (some introduce > http://www.skyeye.org/wiki/SkyeyeDBCTen). > > In dbct, I get the binary code like what you do in this patch. > define a functon, get binary code from this function, and use it for > other thing. > > But I want say, to maintain is not very easy. =A0At least, we need give u= p -O2. > > Because Gcc's optimization will compile the function that support the > code to some asm code that we don't want it to be. > > Any other trouble is , different user will use different version gcc, > different version gcc's optimization is different. > Actually, after gcc4, this issue is very different to handle. > > And old version QEMU use this idea too. =A0And it has this issue too. > So a long time, compile qemu need gcc3. > Now, qemu handle this issue because it give up the old way and use TCC > to get the code. > > Hope it can help a little better. > > Thanks, > Hui > > On Sun, Jun 20, 2010 at 00:16, Doug Evans wrote: >> Yeah. >> Until it gets fixed a workaround is to compile linux-x86-low.c with -O0. >> >> >> On Sat, Jun 19, 2010 at 9:12 AM, Hui Zhu wrote: >>> lubuntu 10.04: >>> >>> make[4]: ?????? `/home/teawater/gdb/bgdball/gdb/gdbserver' >>> rm -f gdbserver >>> gcc -Wall -g -O2 =A0 =A0-I. -I../../../src/gdb/gdbserver >>> -I../../../src/gdb/gdbserver/../common >>> -I../../../src/gdb/gdbserver/../regformats >>> -I../../../src/gdb/gdbserver/../../include >>> -Wl,--dynamic-list=3D../../../src/gdb/gdbserver/proc-service.list -o >>> gdbserver inferiors.o regcache.o remote-utils.o server.o signals.o >>> target.o utils.o version.o mem-break.o hostio.o event-loop.o >>> tracepoint.o xml-builtin.o i386-linux.o i386-avx-linux.o >>> i386-mmx-linux.o linux-low.o linux-x86-low.o i386-low.o i387-fp.o >>> hostio-errno.o thread-db.o proc-service.o =A0\ >>> =A0 =A0 =A0 =A0 =A0-ldl >>> linux-x86-low.o: In function `i386_emit_void_call_2': >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2426: >>> undefined reference to `end_i386_void_call_2_a' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2426: >>> undefined reference to `start_i386_void_call_2_a' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2426: >>> undefined reference to `start_i386_void_call_2_a' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2447: >>> undefined reference to `end_i386_void_call_2_b' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2447: >>> undefined reference to `start_i386_void_call_2_b' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2447: >>> undefined reference to `start_i386_void_call_2_b' >>> linux-x86-low.o: In function `i386_emit_int_call_1': >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2398: >>> undefined reference to `end_i386_int_call_1_a' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2398: >>> undefined reference to `start_i386_int_call_1_a' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2398: >>> undefined reference to `start_i386_int_call_1_a' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2412: >>> undefined reference to `end_i386_int_call_1_c' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2412: >>> undefined reference to `start_i386_int_call_1_c' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2412: >>> undefined reference to `start_i386_int_call_1_c' >>> linux-x86-low.o: In function `i386_emit_swap': >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2364: >>> undefined reference to `end_i386_swap' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2364: >>> undefined reference to `start_i386_swap' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2364: >>> undefined reference to `start_i386_swap' >>> linux-x86-low.o: In function `i386_emit_zero_ext': >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2343: >>> undefined reference to `end_i386_zero_ext_8' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2343: >>> undefined reference to `start_i386_zero_ext_8' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2343: >>> undefined reference to `start_i386_zero_ext_8' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2353: >>> undefined reference to `end_i386_zero_ext_32' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2353: >>> undefined reference to `start_i386_zero_ext_32' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2353: >>> undefined reference to `start_i386_zero_ext_32' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2348: >>> undefined reference to `end_i386_zero_ext_16' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2348: >>> undefined reference to `start_i386_zero_ext_16' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2348: >>> undefined reference to `start_i386_zero_ext_16' >>> linux-x86-low.o: In function `i386_emit_stack_flush': >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2332: >>> undefined reference to `end_i386_stack_flush' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2332: >>> undefined reference to `start_i386_stack_flush' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2332: >>> undefined reference to `start_i386_stack_flush' >>> linux-x86-low.o: In function `i386_emit_pop': >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2324: >>> undefined reference to `end_i386_pop' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2324: >>> undefined reference to `start_i386_pop' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2324: >>> undefined reference to `start_i386_pop' >>> linux-x86-low.o: In function `i386_emit_goto': >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2227: >>> undefined reference to `end_i386_goto' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2227: >>> undefined reference to `start_i386_goto' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2227: >>> undefined reference to `start_i386_goto' >>> linux-x86-low.o: In function `i386_emit_if_goto': >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2209: >>> undefined reference to `end_i386_if_goto' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2209: >>> undefined reference to `start_i386_if_goto' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2209: >>> undefined reference to `start_i386_if_goto' >>> linux-x86-low.o: In function `i386_emit_ref': >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2187: >>> undefined reference to `end_i386_ref1' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2187: >>> undefined reference to `start_i386_ref1' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2187: >>> undefined reference to `start_i386_ref1' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2199: >>> undefined reference to `end_i386_ref8' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2199: >>> undefined reference to `start_i386_ref8' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2199: >>> undefined reference to `start_i386_ref8' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2191: >>> undefined reference to `end_i386_ref2' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2191: >>> undefined reference to `start_i386_ref2' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2191: >>> undefined reference to `start_i386_ref2' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2195: >>> undefined reference to `end_i386_ref4' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2195: >>> undefined reference to `start_i386_ref4' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2195: >>> undefined reference to `start_i386_ref4' >>> linux-x86-low.o: In function `i386_emit_less_unsigned': >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2165: >>> undefined reference to `end_i386_less_unsigned' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2165: >>> undefined reference to `start_i386_less_unsigned' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2165: >>> undefined reference to `start_i386_less_unsigned' >>> linux-x86-low.o: In function `i386_emit_less_signed': >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2146: >>> undefined reference to `end_i386_less_signed' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2146: >>> undefined reference to `start_i386_less_signed' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2146: >>> undefined reference to `start_i386_less_signed' >>> linux-x86-low.o: In function `i386_emit_equal': >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2128: >>> undefined reference to `end_i386_equal' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2128: >>> undefined reference to `start_i386_equal' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2128: >>> undefined reference to `start_i386_equal' >>> linux-x86-low.o: In function `i386_emit_bit_not': >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2120: >>> undefined reference to `end_i386_bit_not' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2120: >>> undefined reference to `start_i386_bit_not' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2120: >>> undefined reference to `start_i386_bit_not' >>> linux-x86-low.o: In function `i386_emit_bit_xor': >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2111: >>> undefined reference to `end_i386_xor' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2111: >>> undefined reference to `start_i386_xor' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2111: >>> undefined reference to `start_i386_xor' >>> linux-x86-low.o: In function `i386_emit_bit_or': >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2102: >>> undefined reference to `end_i386_or' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2102: >>> undefined reference to `start_i386_or' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2102: >>> undefined reference to `start_i386_or' >>> linux-x86-low.o: In function `i386_emit_bit_and': >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2093: >>> undefined reference to `end_i386_and' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2093: >>> undefined reference to `start_i386_and' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2093: >>> undefined reference to `start_i386_and' >>> linux-x86-low.o: In function `i386_emit_log_not': >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2082: >>> undefined reference to `end_i386_log_not' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2082: >>> undefined reference to `start_i386_log_not' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2082: >>> undefined reference to `start_i386_log_not' >>> linux-x86-low.o: In function `i386_emit_ext': >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2057: >>> undefined reference to `end_i386_ext_8' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2057: >>> undefined reference to `start_i386_ext_8' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2057: >>> undefined reference to `start_i386_ext_8' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2070: >>> undefined reference to `end_i386_ext_32' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2070: >>> undefined reference to `start_i386_ext_32' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2070: >>> undefined reference to `start_i386_ext_32' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2064: >>> undefined reference to `end_i386_ext_16' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2064: >>> undefined reference to `start_i386_ext_16' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2064: >>> undefined reference to `start_i386_ext_16' >>> linux-x86-low.o: In function `i386_emit_sub': >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2020: >>> undefined reference to `end_i386_sub' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2020: >>> undefined reference to `start_i386_sub' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2020: >>> undefined reference to `start_i386_sub' >>> linux-x86-low.o: In function `i386_emit_add': >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2011: >>> undefined reference to `end_i386_add' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2011: >>> undefined reference to `start_i386_add' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2011: >>> undefined reference to `start_i386_add' >>> linux-x86-low.o: In function `i386_emit_epilogue': >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:1999: >>> undefined reference to `end_i386_epilogue' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:1999: >>> undefined reference to `start_i386_epilogue' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:1999: >>> undefined reference to `start_i386_epilogue' >>> linux-x86-low.o: In function `i386_emit_prologue': >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:1989: >>> undefined reference to `end_i386_prologue' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:1989: >>> undefined reference to `start_i386_prologue' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:1989: >>> undefined reference to `start_i386_prologue' >>> linux-x86-low.o: In function `i386_emit_reg': >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2302: >>> undefined reference to `end_i386_reg_a' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2302: >>> undefined reference to `start_i386_reg_a' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2302: >>> undefined reference to `start_i386_reg_a' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2311: >>> undefined reference to `end_i386_reg_b' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2311: >>> undefined reference to `start_i386_reg_b' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2311: >>> undefined reference to `start_i386_reg_b' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2316: >>> undefined reference to `end_i386_reg_c' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2316: >>> undefined reference to `start_i386_reg_c' >>> /home/teawater/gdb/bgdball/gdb/gdbserver/../../../src/gdb/gdbserver/lin= ux-x86-low.c:2316: >>> undefined reference to `start_i386_reg_c' >>> collect2: ld returned 1 exit status >>> make[4]: *** [gdbserver] ?? 1 >>> make[4]:?????? `/home/teawater/gdb/bgdball/gdb/gdbserver' >>> make[3]: *** [subdir_do] ?? 1 >>> make[3]:?????? `/home/teawater/gdb/bgdball/gdb' >>> make[2]: *** [all] ?? 2 >>> make[2]:?????? `/home/teawater/gdb/bgdball/gdb' >>> make[1]: *** [all-gdb] ?? 2 >>> make[1]:?????? `/home/teawater/gdb/bgdball' >>> >>> >>> On Fri, Jun 18, 2010 at 02:03, Michael Snyder wrot= e: >>>> Stan Shebs wrote: >>>>> >>>>> Pedro Alves wrote: >>>>>> >>>>>> On Wednesday 16 June 2010 20:12:44, Stan Shebs wrote: >>>>>> >>>>>>> >>>>>>> Doug Evans wrote: >>>>>>> >>>>>>>> >>>>>>>> On Mon, Jun 14, 2010 at 3:19 PM, Pedro Alves >>>>>>>> wrote: >>>>>>>> >>>>>>>>> >>>>>>>>> Thanks. =A0I've checked the whole thing in. >>>>>>>>> >>>>>>>> >>>>>>>> I'm getting build failures that go away when compiling linux-x86-l= ow.c >>>>>>>> with -g. >>>>>>>> >>>>>>>> gcc is optimizing out the skipped over stuff I believe. >>>>>>>> >>>>>>> >>>>>>> Hmm, this particular trickery was my idea, but it always seemed >>>>>>> vulnerable to ever-smarter optimization. =A0Does anybody have any b= etter >>>>>>> strategy? =A0Declaring the asm volatile didn't work, because the co= mpiler was >>>>>>> whacking everything around it. >>>>>>> >>>>>>> The other approach is to build up instructions from bitfields, whic= h is >>>>>>> reliable but needs a lot of setup and helper routines. >>>>>>> >>>>>> >>>>>> Quick thought: can we stick a couple of __attribute__((used))'s in t= he >>>>>> macro, so the compiler doesn optimized things away, thinking they're >>>>>> unused (given the uses are behind asm)? >>>>>> >>>>> >>>>> The compiler is discarding the code with the definitions of the label= s, >>>>> because it's thinking they are maybe somewhere else in the program (t= he >>>>> error is at link time). =A0Moving the labels into C code would fix th= at I >>>>> think, but then it's hard to guarantee that the compiler won't sneak = in a >>>>> bit of code between label and asm sequence. >>>> >>>> Hurrr. =A0Code that depends on such deep knowledge of the compiler's >>>> behavior is wrong code, IMO. >>>> >>>> >>> >> >