From patchwork Mon Aug 25 20:18:19 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Doug Evans X-Patchwork-Id: 2533 Received: (qmail 26737 invoked by alias); 25 Aug 2014 20:18:25 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 26594 invoked by uid 89); 25 Aug 2014 20:18:23 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_LOW, RP_MATCHES_RCVD, SPF_PASS, UNSUBSCRIBE_BODY autolearn=no version=3.3.2 X-HELO: mail-ob0-f201.google.com Received: from mail-ob0-f201.google.com (HELO mail-ob0-f201.google.com) (209.85.214.201) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Mon, 25 Aug 2014 20:18:22 +0000 Received: by mail-ob0-f201.google.com with SMTP id va2so2186116obc.0 for ; Mon, 25 Aug 2014 13:18:20 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-type; bh=Of1WBUwXP5epRHSPWu9beqXJWjHoN7KkH+YioH9rvUI=; b=AULX4kK2+iiVOmqcX3nlnFLCrLNJLONxOcH2022OuqpByHhOQBYlEd2mqH1TBsNLiO mHgt9TriHONiat9OhX8F2uEJoHC3EpxC2iTs2bPG8lOnOs10DEx4c19MIldkgF5urqW/ a/q3ZzMMTM6YBYYzIAJSlOGsK/BavPjhmm/VC/XjtSDMSjOi/4HUTGLxhg+rNbpiSjNt m1CeCtT44NjPpEH0IY87g47JbvdXca9QedHuqsLfvJVXmwQwWkGkgFnnH9jXJv+acGUX uJxAP2OhurXD5haWc8RLN0Ov7VkxTb1VdpXEDgOnZkV+j0wL4tEFcHktJn9Y/6du/CTV xibQ== X-Gm-Message-State: ALoCoQmhvnSkcf8dQXQ2JIB8d8npS9QiXLlakkPALpgU8LGbpRTUn6ClRane2O+VNtLDbZzq0CH4TIZiYie0oNNqdRuF5K3Yzmp4zjntFu3lx6/Djkr5Muakeu4bmfuMfWVYWmWRwime X-Received: by 10.42.10.66 with SMTP id p2mr19353700icp.28.1408997900174; Mon, 25 Aug 2014 13:18:20 -0700 (PDT) Received: from corp2gmr1-2.hot.corp.google.com (corp2gmr1-2.hot.corp.google.com [172.24.189.93]) by gmr-mx.google.com with ESMTPS id d7si61305yho.2.2014.08.25.13.18.20 for (version=TLSv1.1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 25 Aug 2014 13:18:20 -0700 (PDT) Received: from ruffy.mtv.corp.google.com (ruffy.mtv.corp.google.com [172.17.128.44]) by corp2gmr1-2.hot.corp.google.com (Postfix) with ESMTPS id CA8245A44F1 for ; Mon, 25 Aug 2014 13:18:19 -0700 (PDT) From: Doug Evans To: gdb-patches@sourceware.org Subject: [PATCH] Show registers as live in better way in amd64-pseudo.c Date: Mon, 25 Aug 2014 13:18:19 -0700 Message-ID: MIME-Version: 1.0 X-IsSubscribed: yes Hi. This test is failing on clang because clang uses $eax as a temp register here (grep for <<<<): (gdb) disas /m main ... 66 /* amd64-dword.exp writes eax-edi here. 67 Tell gcc they're clobbered so it doesn't try to keep "data" in 68 one of them. */ 69 asm ("" 70 : /* no outputs */ 71 : /* no inputs */ 72 : "eax", "ebx", "ecx", "edx", "esi", "edi"); 73 74 asm ("mov %%eax, 0(%0)\n\t" 0x00000000004006c7 <+119>: mov $0x402020,%eax <<<< 0x00000000004006cc <+124>: mov %eax,%r8d 0x00000000004006cf <+127>: mov %eax,(%r8) 0x00000000004006d2 <+130>: mov %ebx,0x4(%r8) 0x00000000004006d6 <+134>: mov %ecx,0x8(%r8) 0x00000000004006da <+138>: mov %edx,0xc(%r8) 0x00000000004006de <+142>: mov %esi,0x10(%r8) 0x00000000004006e2 <+146>: mov %edi,0x14(%r8) FAIL: gdb.arch/amd64-word.exp: check contents of %ax FAIL: gdb.arch/amd64-word.exp: check contents of %r8w FAIL: gdb.arch/i386-word.exp: check contents of %ax [the {amd64,i386}-byte.exp and amd64-dword.exp tests fail similarly] This patch uses a different mechanism to indicate that eax,etc. are live across the two asms. Regression tested with gcc 4.8.x-google and clang (trunk r215195). 2014-08-25 Doug Evans * gdb.arch/amd64-pseudo.c (main): Rewrite to better specify when eax,etc. are live with values set by gdb and thus the compiler can't use them. * gdb.arch/i386-pseudo.c (main): Ditto. diff --git a/gdb/testsuite/gdb.arch/amd64-pseudo.c b/gdb/testsuite/gdb.arch/amd64-pseudo.c index 4dac1f1..87dc725 100644 --- a/gdb/testsuite/gdb.arch/amd64-pseudo.c +++ b/gdb/testsuite/gdb.arch/amd64-pseudo.c @@ -39,6 +39,21 @@ int data[] = { int main (int argc, char **argv) { + register int eax asm ("eax"); + register int ebx asm ("ebx"); + register int ecx asm ("ecx"); + register int edx asm ("edx"); + register int esi asm ("esi"); + register int edi asm ("edi"); + register long r8 asm ("r8"); + register long r9 asm ("r9"); + register long r10 asm ("r10"); + register long r11 asm ("r11"); + register long r12 asm ("r12"); + register long r13 asm ("r13"); + register long r14 asm ("r14"); + register long r15 asm ("r15"); + asm ("mov 0(%0), %%eax\n\t" "mov 4(%0), %%ebx\n\t" "mov 8(%0), %%ecx\n\t" @@ -63,13 +78,12 @@ main (int argc, char **argv) : "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"); asm ("nop"); /* second breakpoint here */ - /* amd64-dword.exp writes eax-edi here. - Tell gcc they're clobbered so it doesn't try to keep "data" in - one of them. */ + /* amd64-{byte,word,dword}.exp write eax-edi here. + Tell gcc/clang they're live. */ asm ("" - : /* no outputs */ - : /* no inputs */ - : "eax", "ebx", "ecx", "edx", "esi", "edi"); + : "=r" (eax), "=r" (ebx), "=r" (ecx), + "=r" (edx), "=r" (esi), "=r" (edi) + : /* no inputs */); asm ("mov %%eax, 0(%0)\n\t" "mov %%ebx, 4(%0)\n\t" @@ -78,17 +92,19 @@ main (int argc, char **argv) "mov %%esi, 16(%0)\n\t" "mov %%edi, 20(%0)\n\t" : /* no output operands */ - : "r" (data) - : "eax", "ebx", "ecx", "edx", "esi", "edi"); + : "r" (data), + /* Mark these as inputs so that gcc/clang won't try to use them as + a temp to build %0. */ + "r" (eax), "r" (ebx), "r" (ecx), + "r" (edx), "r" (esi), "r" (edi)); asm ("nop"); /* third breakpoint here */ - /* amd64-dword.exp writes r8-r15 here. - Tell gcc they're clobbered so it doesn't try to keep "data" in - one of them. */ + /* amd64-{byte,word,dword}.exp write r8-r15 here. + Tell gcc/clang they're live. */ asm ("" - : /* no outputs */ - : /* no inputs */ - : "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"); + : "=r" (r8), "=r" (r9), "=r" (r10), "=r" (r11), + "=r" (r12), "=r" (r13), "=r" (r14), "=r" (r15) + : /* no inputs */); asm ("mov %%r8d, 24(%0)\n\t" "mov %%r9d, 28(%0)\n\t" @@ -99,8 +115,11 @@ main (int argc, char **argv) "mov %%r14d, 48(%0)\n\t" "mov %%r15d, 52(%0)\n\t" : /* no output operands */ - : "r" (data) - : "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"); + : "r" (data), + /* Mark these as inputs so that gcc/clang won't try to use them as + a temp to build %0. */ + "r" (r8), "r" (r9), "r" (r10), "r" (r11), + "r" (r12), "r" (r13), "r" (r14), "r" (r15)); puts ("Bye!"); /* forth breakpoint here */ return 0; diff --git a/gdb/testsuite/gdb.arch/i386-pseudo.c b/gdb/testsuite/gdb.arch/i386-pseudo.c index 11cbcd5..2acd062 100644 --- a/gdb/testsuite/gdb.arch/i386-pseudo.c +++ b/gdb/testsuite/gdb.arch/i386-pseudo.c @@ -29,6 +29,11 @@ int data[] = { int main (int argc, char **argv) { + register int eax asm ("eax"); + register int ebx asm ("ebx"); + register int ecx asm ("ecx"); + register int edx asm ("edx"); + asm ("mov 0(%0), %%eax\n\t" "mov 4(%0), %%ebx\n\t" "mov 8(%0), %%ecx\n\t" @@ -38,13 +43,21 @@ main (int argc, char **argv) : "eax", "ebx", "ecx", "edx"); asm ("nop"); /* first breakpoint here */ + /* i386-{byte,word}.exp write eax-edx here. + Tell gcc/clang they're live. */ + asm ("" + : "=r" (eax), "=r" (ebx), "=r" (ecx), "=r" (edx) + : /* no inputs */); + asm ("mov %%eax, 0(%0)\n\t" "mov %%ebx, 4(%0)\n\t" "mov %%ecx, 8(%0)\n\t" "mov %%edx, 12(%0)\n\t" : /* no output operands */ - : "r" (data) - : "eax", "ebx", "ecx", "edx"); + : "r" (data), + /* Mark these as inputs so that gcc/clang won't try to use them as + a temp to build %0. */ + "r" (eax), "r" (ebx), "r" (ecx), "r" (edx)); puts ("Bye!"); /* second breakpoint here */ return 0;