From patchwork Wed Jul 25 15:44:37 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Siddhesh Poyarekar X-Patchwork-Id: 173206 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 92A642C009B for ; Thu, 26 Jul 2012 01:45:32 +1000 (EST) Comment: DKIM? See http://www.dkim.org DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=gcc.gnu.org; s=default; x=1343835932; h=Comment: DomainKey-Signature:Received:Received:Received:Received:Received: Date:From:To:Cc:Subject:Message-ID:In-Reply-To:References: Mime-Version:Content-Type:Mailing-List:Precedence:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:Sender: Delivered-To; bh=pC/lEuchN70t6ky08+H7KE0zsjI=; b=hDvhJT42j+RSfFn 9M7IPM2YgupVuKWMi6HOE+QwpHoHV1sXfORG450xtDnmv2e0zI78bEeR5KyjA1CR rTyfQLPRJVu42HHCk4X3RbRqkUZVEZ2yM+AqjUlew88CQG5QfJaMJEP/n/J2p+ym K+0tU3ffgdc6+UParP7IiDvz/Wzs= Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=gcc.gnu.org; h=Received:Received:X-SWARE-Spam-Status:X-Spam-Check-By:Received:Received:Received:Date:From:To:Cc:Subject:Message-ID:In-Reply-To:References:Mime-Version:Content-Type:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=C7/Zcuk6ZAreTqE7g4SScSbSLKxbKmQ86IzmKAd4i1ypsiVyLzDs7wrfgW3jdw 0hH902KCI5s+IyZRy5eAyn9lOlYRg5dmIM6PLAk5Rn0yjTZsMbpWamiMPPKNhEdY gbP1SFTuPjjyfHR1mBpoQdqI6T60Ck6mhMRPuu8Glk5Xg=; Received: (qmail 10353 invoked by alias); 25 Jul 2012 15:45:23 -0000 Received: (qmail 10320 invoked by uid 22791); 25 Jul 2012 15:45:19 -0000 X-SWARE-Spam-Status: No, hits=-7.6 required=5.0 tests=AWL, BAYES_00, KHOP_RCVD_UNTRUST, KHOP_THREADED, RCVD_IN_DNSWL_HI, RCVD_IN_HOSTKARMA_W, SPF_HELO_PASS, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 25 Jul 2012 15:44:58 +0000 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q6PFivgR016745 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 25 Jul 2012 11:44:57 -0400 Received: from spoyarek (vpn-235-231.phx2.redhat.com [10.3.235.231]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q6PFirRU009327; Wed, 25 Jul 2012 11:44:56 -0400 Date: Wed, 25 Jul 2012 21:14:37 +0530 From: Siddhesh Poyarekar To: Richard Henderson Cc: gcc-patches@gcc.gnu.org Subject: Re: [PATCH] Fix assembly dialect handling in asm_fprintf Message-ID: <20120725211437.75140974@spoyarek> In-Reply-To: <50101142.8060806@redhat.com> References: <20120725204029.5ccf50b8@spoyarek> <50101142.8060806@redhat.com> Mime-Version: 1.0 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org On Wed, 25 Jul 2012 08:31:14 -0700, Richard wrote: > > > > * gcc.dg/asm-dialect-1.c: New test case. > > ... except this should go in gcc.target/i386/ without the { target } > qualifier. > Thanks, here's the updated version. Regards, Siddhesh gcc/ChangeLog: 2012-07-25 Siddhesh Poyarekar * final.c [ASSEMBLER_DIALECT](do_assembler_dialects): New function to implement assembler dialects. (output_asm_insn): Use do_assembler_dialects. (asm_fprintf): Likewise. testsuite/ChangeLog: 2012-07-25 Siddhesh Poyarekar * gcc.target/i386/asm-dialect-1.c: New test case. diff --git a/gcc/final.c b/gcc/final.c index 7db0471..095d608 100644 --- a/gcc/final.c +++ b/gcc/final.c @@ -3338,6 +3338,72 @@ output_asm_operand_names (rtx *operands, int *oporder, int nops) } } +#ifdef ASSEMBLER_DIALECT +/* Helper function to parse assembler dialects in the asm string. + This is called from output_asm_insn and asm_fprintf. */ +static const char * +do_assembler_dialects (const char *p, int *dialect) +{ + char c = *(p - 1); + + switch (c) + { + case '{': + { + int i; + + if (*dialect) + output_operand_lossage ("nested assembly dialect alternatives"); + else + *dialect = 1; + + /* If we want the first dialect, do nothing. Otherwise, skip + DIALECT_NUMBER of strings ending with '|'. */ + for (i = 0; i < dialect_number; i++) + { + while (*p && *p != '}' && *p++ != '|') + ; + if (*p == '}') + break; + } + + if (*p == '\0') + output_operand_lossage ("unterminated assembly dialect alternative"); + } + break; + + case '|': + if (*dialect) + { + /* Skip to close brace. */ + do + { + if (*p == '\0') + { + output_operand_lossage ("unterminated assembly dialect alternative"); + break; + } + } + while (*p++ != '}'); + *dialect = 0; + } + else + putc (c, asm_out_file); + break; + + case '}': + if (! *dialect) + putc (c, asm_out_file); + *dialect = 0; + break; + default: + gcc_unreachable (); + } + + return p; +} +#endif + /* Output text from TEMPLATE to the assembler output file, obeying %-directions to substitute operands taken from the vector OPERANDS. @@ -3404,54 +3470,9 @@ output_asm_insn (const char *templ, rtx *operands) #ifdef ASSEMBLER_DIALECT case '{': - { - int i; - - if (dialect) - output_operand_lossage ("nested assembly dialect alternatives"); - else - dialect = 1; - - /* If we want the first dialect, do nothing. Otherwise, skip - DIALECT_NUMBER of strings ending with '|'. */ - for (i = 0; i < dialect_number; i++) - { - while (*p && *p != '}' && *p++ != '|') - ; - if (*p == '}') - break; - if (*p == '|') - p++; - } - - if (*p == '\0') - output_operand_lossage ("unterminated assembly dialect alternative"); - } - break; - - case '|': - if (dialect) - { - /* Skip to close brace. */ - do - { - if (*p == '\0') - { - output_operand_lossage ("unterminated assembly dialect alternative"); - break; - } - } - while (*p++ != '}'); - dialect = 0; - } - else - putc (c, asm_out_file); - break; - case '}': - if (! dialect) - putc (c, asm_out_file); - dialect = 0; + case '|': + p = do_assembler_dialects (p, &dialect); break; #endif @@ -3910,6 +3931,9 @@ asm_fprintf (FILE *file, const char *p, ...) { char buf[10]; char *q, c; +#ifdef ASSEMBLER_DIALECT + int dialect = 0; +#endif va_list argptr; va_start (argptr, p); @@ -3921,29 +3945,9 @@ asm_fprintf (FILE *file, const char *p, ...) { #ifdef ASSEMBLER_DIALECT case '{': - { - int i; - - /* If we want the first dialect, do nothing. Otherwise, skip - DIALECT_NUMBER of strings ending with '|'. */ - for (i = 0; i < dialect_number; i++) - { - while (*p && *p++ != '|') - ; - - if (*p == '|') - p++; - } - } - break; - - case '|': - /* Skip to close brace. */ - while (*p && *p++ != '}') - ; - break; - case '}': + case '|': + p = do_assembler_dialects (p, &dialect); break; #endif diff --git a/gcc/testsuite/gcc.target/i386/asm-dialect-1.c b/gcc/testsuite/gcc.target/i386/asm-dialect-1.c new file mode 100644 index 0000000..a53d2e9 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/asm-dialect-1.c @@ -0,0 +1,15 @@ +/* { dg-options "-masm=intel" } */ + +extern void abort (void); + +int +main (void) +{ + int f = 0; + asm ("{movl $42, %%eax | mov eax, 42}" : :); + asm ("{movl $41, %0||mov %0, 43}" : "=r"(f)); + if (f != 42) + abort (); + + return 0; +}