From patchwork Wed Oct 31 16:53:19 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 149841 Delivered-To: patch@linaro.org Received: by 2002:a2e:299d:0:0:0:0:0 with SMTP id p29-v6csp7033734ljp; Wed, 31 Oct 2018 09:55:28 -0700 (PDT) X-Google-Smtp-Source: AJdET5f3/ylkOKKNYFcYNaCE8GAqJQti9MPKUKb37fD3Ok595sKCFNuqanaFh1j4tx2evbHO7sI2 X-Received: by 2002:a0c:d4f9:: with SMTP id y54mr3440636qvh.98.1541004928164; Wed, 31 Oct 2018 09:55:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1541004928; cv=none; d=google.com; s=arc-20160816; b=JPMfSk/Yj+BnU9wQQ6cKNxT6P47lwlRlfF2cQcRYASgOYiDjhvZO2ktdJfHEUVNtnW vX5ybsUzistV82QhS9/B/jkWUsjKqqtxQ0Cd5PnX+2d71tHUbbKwtuBCaSMkBH0kxucG SXIaA3BQE8YDUX4GOCZuT/NCYbp1zBcZChosX2s/hMtVrm/C2OkK0xGTf/gZ0VAo+j+b buCXrk1dJ7lu+eNu5uEOTLHQtULHUTQCiO6pxkThwfAySsGPXle5Mb2HpzZqLsLKZkjf uAMFdHnagedDKGY3FVQH57Wo1vFCXmv3yWDZMjFaokqYjQTUFxrhjk8DwtKmat89oLPJ Up7g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject :content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature; bh=bU4KtBaMq0/J1opLvJyUc1Xb5onyX/Mfcf0M+HswhT0=; b=yu5EEwxZbSny3A/QMZsmIx2t3R5HHVIVPACOSKW9SupxKcHfWc1qbN8ka745+FQAY0 nqxWqJlgAbX6NejYAqg0v8gl12Be77GZphctm7qTDlvJc8uzP96kPwKykddi9OOVcyqZ P50fKUB0JTB5GqI0FcKJRjg6HgJ0wgKAD8m3Y9yXbxLAJKKQ+uSq0vRgekbubrKbI8sb 7pq9OStxivU426c8oSnqP1AO0T6Aj/Dl7jtRMQ1yv818qp/IKbSVhmGD7ZaxpmsWLumk Vat3gpbDyViJEnX7li/70tkaFgQvItqRKeXk8hmgoJLBY9RKiSLAtx5CoJBXY++GlpFJ H3Gg== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=F29H6lK+; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [2001:4830:134:3::11]) by mx.google.com with ESMTPS id d19si3825955qvd.218.2018.10.31.09.55.27 for (version=TLS1 cipher=AES128-SHA bits=128/128); Wed, 31 Oct 2018 09:55:28 -0700 (PDT) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) client-ip=2001:4830:134:3::11; Authentication-Results: mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=F29H6lK+; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1]:60783 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gHtmB-0006cp-EL for patch@linaro.org; Wed, 31 Oct 2018 12:55:27 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:56326) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gHtkY-0005Xy-8b for qemu-devel@nongnu.org; Wed, 31 Oct 2018 12:53:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gHtkV-0008P1-Lj for qemu-devel@nongnu.org; Wed, 31 Oct 2018 12:53:46 -0400 Received: from mail-wm1-x336.google.com ([2a00:1450:4864:20::336]:37162) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gHtkV-0008E7-7o for qemu-devel@nongnu.org; Wed, 31 Oct 2018 12:53:43 -0400 Received: by mail-wm1-x336.google.com with SMTP id p2-v6so15139831wmc.2 for ; Wed, 31 Oct 2018 09:53:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=bU4KtBaMq0/J1opLvJyUc1Xb5onyX/Mfcf0M+HswhT0=; b=F29H6lK+Cp/uXb23A1uHhJWIBqbdINiFRB7J01kX3ANKxvq63cmUgK5gXWxJGOBFu1 ajSUtubEjHujAcXa62oo6lCrx/Q2n3Wpr/B7SRjJAntXG6MdfhHdl9qtbbI8L0YRYro0 di3hQw0y050ayREyAyVgA8aX3o5b6tRMqlrCI= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=bU4KtBaMq0/J1opLvJyUc1Xb5onyX/Mfcf0M+HswhT0=; b=VBh8yTQo5l5KbUM6QlI7D8Y/nNNDYULY8m65s618ghqisUEK94tt9lX72I6/RU3OVQ SqZHKg4Gtn77YajjNvoxeZx6a0RGxaPn8p8KXGqUHU44P5Joi3Zv6Rh082zGLG9piEkD LSPbANrcXWVb2FE81fex1wfm7GnD06QMgV1M/uhsXZ5xLSAY06HpR5SiOeRflx9oZKiI 9LrLAm0huDWlOm1W9umo+QY2/YOLnfz/aW0N3cbhGXfC0Eaj7awO9ooxWFb2afRMf5u2 UHRlM3BhCDI+rta2uMo06nmCH+D8LJvnV3dQu3Jn+CzQaqG1Ij096hLETE2T6ocNyJ6h iLlQ== X-Gm-Message-State: AGRZ1gJDbxZFGeRZZh78xHkw2uH/dqaEjCKqHb3BNFci5VvX39dexUs6 f5RWveI3COgRtN8xZ4BoWHuvKjhMtG8= X-Received: by 2002:a1c:bc82:: with SMTP id m124-v6mr2981302wmf.76.1541004804734; Wed, 31 Oct 2018 09:53:24 -0700 (PDT) Received: from cloudburst.twiddle.net.twiddle.net (79-69-241-110.dynamic.dsl.as9105.com. [79.69.241.110]) by smtp.gmail.com with ESMTPSA id u5-v6sm7580168wrm.77.2018.10.31.09.53.23 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 31 Oct 2018 09:53:24 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Wed, 31 Oct 2018 16:53:19 +0000 Message-Id: <20181031165321.4422-2-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20181031165321.4422-1-richard.henderson@linaro.org> References: <20181031165321.4422-1-richard.henderson@linaro.org> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::336 Subject: [Qemu-devel] [PULL 1/3] decodetree: Add !extern flag to argument sets X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: peter.maydell@linaro.org Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" Allow argument sets to be shared between two decoders by avoiding a re-declaration error. Make sure that anonymous argument sets and anonymous formats have unique names. Tested-by: Philippe Mathieu-Daudé Reviewed-by: Philippe Mathieu-Daudé Reviewed-by: Bastian Koppelmann Signed-off-by: Richard Henderson --- scripts/decodetree.py | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) -- 2.17.2 diff --git a/scripts/decodetree.py b/scripts/decodetree.py index 457cffea90..28bbd4e3c1 100755 --- a/scripts/decodetree.py +++ b/scripts/decodetree.py @@ -63,13 +63,16 @@ # # *** Argument set syntax: # -# args_def := '&' identifier ( args_elt )+ +# args_def := '&' identifier ( args_elt )+ ( !extern )? # args_elt := identifier # # Each args_elt defines an argument within the argument set. # Each argument set will be rendered as a C structure "arg_$name" # with each of the fields being one of the member arguments. # +# If !extern is specified, the backing structure is assumed to +# have been already declared, typically via a second decoder. +# # Argument set examples: # # ®3 ra rb rc @@ -167,6 +170,7 @@ input_file = '' output_file = None output_fd = None insntype = 'uint32_t' +decode_function = 'decode' re_ident = '[a-zA-Z][a-zA-Z0-9_]*' @@ -392,8 +396,9 @@ class FunctionField: class Arguments: """Class representing the extracted fields of a format""" - def __init__(self, nm, flds): + def __init__(self, nm, flds, extern): self.name = nm + self.extern = extern self.fields = sorted(flds) def __str__(self): @@ -403,10 +408,11 @@ class Arguments: return 'arg_' + self.name def output_def(self): - output('typedef struct {\n') - for n in self.fields: - output(' int ', n, ';\n') - output('} ', self.struct_name(), ';\n\n') + if not self.extern: + output('typedef struct {\n') + for n in self.fields: + output(' int ', n, ';\n') + output('} ', self.struct_name(), ';\n\n') # end Arguments @@ -540,7 +546,11 @@ def parse_arguments(lineno, name, toks): global re_ident flds = [] + extern = False for t in toks: + if re_fullmatch('!extern', t): + extern = True + continue if not re_fullmatch(re_ident, t): error(lineno, 'invalid argument set token "{0}"'.format(t)) if t in flds: @@ -549,7 +559,7 @@ def parse_arguments(lineno, name, toks): if name in arguments: error(lineno, 'duplicate argument set', name) - arguments[name] = Arguments(name, flds) + arguments[name] = Arguments(name, flds, extern) # end parse_arguments @@ -573,13 +583,14 @@ def add_field_byname(lineno, flds, new_name, old_name): def infer_argument_set(flds): global arguments + global decode_function for arg in arguments.values(): if eq_fields_for_args(flds, arg.fields): return arg - name = str(len(arguments)) - arg = Arguments(name, flds.keys()) + name = decode_function + str(len(arguments)) + arg = Arguments(name, flds.keys(), False) arguments[name] = arg return arg @@ -587,6 +598,7 @@ def infer_argument_set(flds): def infer_format(arg, fieldmask, flds): global arguments global formats + global decode_function const_flds = {} var_flds = {} @@ -606,7 +618,7 @@ def infer_format(arg, fieldmask, flds): continue return (fmt, const_flds) - name = 'Fmt_' + str(len(formats)) + name = decode_function + '_Fmt_' + str(len(formats)) if not arg: arg = infer_argument_set(flds) @@ -971,8 +983,8 @@ def main(): global insnwidth global insntype global insnmask + global decode_function - decode_function = 'decode' decode_scope = 'static ' long_opts = ['decode=', 'translate=', 'output=', 'insnwidth=']