From nobody Tue Dec 16 21:28:45 2025 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8A4E3299959 for ; Mon, 8 Sep 2025 19:30:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757359837; cv=none; b=i2cxAQLb70gg87AQOz5QBGWEOvBmH5m2eNYjV6f5Hswe6c9w7jyseneiFnwkEk5UsbCPidC2DmPbdD6xyXf6KyiOz09SFuIZg6y2sApa4VBaAKag97aTCcf266OiUEwdO4+6nJk11/heZ5AdAfIMSzRjSOJk102WFKQqEQJJhPI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757359837; c=relaxed/simple; bh=yLpgIfUCleO8WU1MNGXDek/R6mdQBiOB7DG+PLzA05E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=WjIsqpIKYcpLYM5gmsACyCXJFFG0WHNXgIwqr1yGXbkcZlcSbE1vwIpEJ1hMCNu5UPlhWwd5VDf2N7lHYkQPnzMmscCI8nNGYexieyMUaZWy9T0hTy/iT7EG8VLfegqlFBd1kwrH0hU4NOJoFMsLZDBUuY63YV9qXfdAhrOu3UU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=eoiXwSBy; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="eoiXwSBy" Received: from pps.filterd (m0279862.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 588HI09b029318 for ; Mon, 8 Sep 2025 19:30:34 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=4+SCGg2uZG2 0kx2fs+zMpfdIiS1DqISeX8L2+3UuUCs=; b=eoiXwSByhib5wNqaZSdqnw0BhdJ xxEQBZ5ZWbpXcujPHIT0VYGYRrQ1w1KlMlCv8dstEZCMtqxcmlgds+QKhyuVgg8Q qcrbZiBW2wqXaoP8J8wkcuILaiC+29QhpUAvL1kp8t6IpXucjO5C+i2rt6A3HicV rfJigDss3/oMs1NZKos8jv+Kx5WRacisPu1Vg1xh8/L/f8JSH0Bz78+r+jf+24Cr ZYxVtbRfNY64Z7DC1bDujHBrNbEXaMZJyY+JFoxwiX1MLCPZ4IzbYMbrUd9nh/id y8eSAnRaURK7MN8cH2We/ZWMg4C0qeT6l5IDkl7CJ89hrt1ftJYQ4RxHCig== Received: from mail-pf1-f199.google.com (mail-pf1-f199.google.com [209.85.210.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 490dqfwmad-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Mon, 08 Sep 2025 19:30:34 +0000 (GMT) Received: by mail-pf1-f199.google.com with SMTP id d2e1a72fcca58-76e2eb787f2so4926820b3a.3 for ; Mon, 08 Sep 2025 12:30:34 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757359834; x=1757964634; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=4+SCGg2uZG20kx2fs+zMpfdIiS1DqISeX8L2+3UuUCs=; b=JwuvUUMJmORhybF8W4TqEP4McPE51TJ1ma5ju2mXN7An89oLImfx/uC0SkQdYwos6K ce7xAt0fyVDYU/5ZHl3GvHfTBZ14t35zV/8WMv02ujj18yTQhHikyX0vqSxT+NR+50po ytJBaCaz74Hv4cI43LlHTVEjFLv0mbFwDOnlEyweJhfXfENKDY6Me4ng/1nmIOtBRKz9 x+wCq6llfP7hl/eOUskdjOVhL6A0iGkEskYBSo7YxZo9LCsLw8GFU6vKiBfmxAM7o0uU mxV5l87Oc2MxfEYTb8lJYcE11+cb8CEXbSzYpGicjN6pr9SYlveRVmwAJqtRDrehgubB o3+Q== X-Forwarded-Encrypted: i=1; AJvYcCVhhXwXxKcskrVBGK2p/wpyzaK/khC6+dnAxaQAC3DgHidZUItDW+YIcRJJaQLJumtXzuxdFxcQbYBglGU=@vger.kernel.org X-Gm-Message-State: AOJu0YylsrhOOqUKKC2/QNj+vmxRIrKqhA3C6WMzH3jlRxHXMuRKSXPe Faa346PIc+No0sxDuPSkKjygwCw42mP+pf+47BwvarMdXWeq/mNEmsp1KkhGXqHNvgXrqUZnPGQ PeOoWr4KeVR8X5BaLj5Y/hL2EeP9kXQmmQP93O36aWN7qII/vQbPLjU/KdjHtqQeWkvI= X-Gm-Gg: ASbGncvvH8/Iw6OnTVAx3P+yfl32UNEac3TSjX/piVb+qf7TeCKghPIyEOZN9JSQzgC LblzDHThgfbJXrp9PGlRh4TUTEBNyeJcd4xZAkTvX1sG329U85yfU0SR96W1uJX6TfduqUlLCPT 0nVwpAd9HQciBuUqvuTr49spuqswxC6O0ntzZMJGZ7ZlB923+g4NbVtLeMdDGhcZQwfLdVhvSTU qvyi3KXn6oyG3W0JlXW9LeuHILB7azU1bo4PFKTJcT9nTErs/WDzdWWN+X9tNPX7Hj7+0YLs1JB r9yoPATrzyLI7tCD94B/VhPBrfBL1TA+YLAqC2DuSu7QOBB9uxw= X-Received: by 2002:a05:6a00:2e07:b0:771:e06b:7edf with SMTP id d2e1a72fcca58-7742de14879mr12074337b3a.24.1757359833500; Mon, 08 Sep 2025 12:30:33 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHhdcJscj+Nn9YJ18fqNOHlXe86gSyqOPdIsweAgzahuM9po/XXuGDoJB6W2hoLYBVXrOqPog== X-Received: by 2002:a05:6a00:2e07:b0:771:e06b:7edf with SMTP id d2e1a72fcca58-7742de14879mr12074302b3a.24.1757359832988; Mon, 08 Sep 2025 12:30:32 -0700 (PDT) Received: from localhost ([2601:1c0:5000:d5c:5b3e:de60:4fda:e7b1]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7725f0c4008sm22231699b3a.35.2025.09.08.12.30.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 08 Sep 2025 12:30:32 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: freedreno@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , David Airlie , Simona Vetter , linux-kernel@vger.kernel.org (open list) Subject: [PATCH 2/5] drm/msm/registers: Sync gen_header.py from mesa Date: Mon, 8 Sep 2025 12:30:05 -0700 Message-ID: <20250908193021.605012-3-robin.clark@oss.qualcomm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20250908193021.605012-1-robin.clark@oss.qualcomm.com> References: <20250908193021.605012-1-robin.clark@oss.qualcomm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-ORIG-GUID: mLv8gbZzM4jfZ5c-sx7up3cxr2HA4e_o X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwOTA2MDAzNSBTYWx0ZWRfX0ikVyWOA0gQ1 wIzb98D1LENCXe221JRiYQdb0S9/6wK5h1+VnNLEBNnO1ivF0Ad+mlgx23qY6zApej33r+QCx3u OMqJZNRfEIFUNOMLUfX/zKkQJmNTTAY9vcbOa9Y6kOKDgFU+1y0EoZemRpHuDLduJdxZuaMPiTB xxjZRGmujjBgC7xubSs0D75qgTBNEKePu5jOKigAo9BEkGjG3KFYV+SDJgAH8LZPXwXMDz8875r rrpwtBsbpbp4i6hoy1TdA55LZ4Rd6inr9rpRjdYJLlHUNgyXpIViIMiNbVkgjv/Y97JkwyDutKJ joG7wgWS3MesUcn94YZX7YJK7ebVKDj/vetBTWL6aB6oVcQmK+z0FFKENYZJdTVrNdYQpcHjnhK awkab2rE X-Proofpoint-GUID: mLv8gbZzM4jfZ5c-sx7up3cxr2HA4e_o X-Authority-Analysis: v=2.4 cv=N8UpF39B c=1 sm=1 tr=0 ts=68bf2eda cx=c_pps a=WW5sKcV1LcKqjgzy2JUPuA==:117 a=xqWC_Br6kY4A:10 a=yJojWOMRYYMA:10 a=EUspDBNiAAAA:8 a=GifcLulCTFgA3kaJcUoA:9 a=OpyuDcXvxspvyRM73sMx:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1117,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-09-08_06,2025-09-08_02,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 spamscore=0 malwarescore=0 clxscore=1015 bulkscore=0 suspectscore=0 priorityscore=1501 impostorscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2507300000 definitions=main-2509060035 Content-Type: text/plain; charset="utf-8" Sync from mesa commit 04e2140d8be7 ("freedreno/registers: remove python 3.9 dependency for compiling msm"). Signed-off-by: Rob Clark --- drivers/gpu/drm/msm/registers/gen_header.py | 157 +++++++++++++------- 1 file changed, 107 insertions(+), 50 deletions(-) diff --git a/drivers/gpu/drm/msm/registers/gen_header.py b/drivers/gpu/drm/= msm/registers/gen_header.py index 56273a810c1d..16239b754804 100644 --- a/drivers/gpu/drm/msm/registers/gen_header.py +++ b/drivers/gpu/drm/msm/registers/gen_header.py @@ -11,7 +11,6 @@ import collections import argparse import time import datetime -import re =20 class Error(Exception): def __init__(self, message): @@ -31,7 +30,7 @@ class Enum(object): def names(self): return [n for (n, value) in self.values] =20 - def dump(self): + def dump(self, is_deprecated): use_hex =3D False for (name, value) in self.values: if value > 0x1000: @@ -45,7 +44,7 @@ class Enum(object): print("\t%s =3D %d," % (name, value)) print("};\n") =20 - def dump_pack_struct(self): + def dump_pack_struct(self, is_deprecated): pass =20 class Field(object): @@ -70,11 +69,11 @@ class Field(object): raise parser.error("booleans should be 1 bit fields") elif self.type =3D=3D "float" and not (high - low =3D=3D 31 or high - lo= w =3D=3D 15): raise parser.error("floats should be 16 or 32 bit fields") - elif not self.type in builtin_types and not self.type in parser.enums: + elif self.type not in builtin_types and self.type not in parser.enums: raise parser.error("unknown type '%s'" % self.type) =20 def ctype(self, var_name): - if self.type =3D=3D None: + if self.type is None: type =3D "uint32_t" val =3D var_name elif self.type =3D=3D "boolean": @@ -124,7 +123,7 @@ def field_name(reg, f): name =3D f.name.lower() else: # We hit this path when a reg is defined with no bitset fields, ie. - # + # name =3D reg.name.lower() =20 if (name in [ "double", "float", "int" ]) or not (name[0].isalpha()): @@ -146,6 +145,18 @@ def indices_strides(indices): "%s(i%d)" % (offset, idx) for (idx, (ctype, stride, offset)) in enumerate(indices)]) =20 +def is_number(str): + try: + int(str) + return True + except ValueError: + return False + +def sanitize_variant(variant): + if variant and "-" in variant: + return variant[:variant.index("-")] + return variant + class Bitset(object): def __init__(self, name, template): self.name =3D name @@ -175,11 +186,7 @@ class Bitset(object): print("#endif\n") =20 print(" return (struct fd_reg_pair) {") - if reg.array: - print(" .reg =3D REG_%s(__i)," % reg.full_name) - else: - print(" .reg =3D REG_%s," % reg.full_name) - + print(" .reg =3D (uint32_t)%s," % reg.reg_offset()) print(" .value =3D") for f in self.fields: if f.type in [ "address", "waddress" ]: @@ -204,7 +211,7 @@ class Bitset(object): =20 print(" };") =20 - def dump_pack_struct(self, reg=3DNone): + def dump_pack_struct(self, is_deprecated, reg=3DNone): if not reg: return =20 @@ -229,12 +236,15 @@ class Bitset(object): tab_to(" uint32_t", "dword;") print("};\n") =20 + depcrstr =3D "" + if is_deprecated: + depcrstr =3D " FD_DEPRECATED" if reg.array: - print("static inline struct fd_reg_pair\npack_%s(uint32_t __i, struct %= s fields)\n{" % - (prefix, prefix)) + print("static inline%s struct fd_reg_pair\npack_%s(uint32_t __i, struct= %s fields)\n{" % + (depcrstr, prefix, prefix)) else: - print("static inline struct fd_reg_pair\npack_%s(struct %s fields)\n{" % - (prefix, prefix)) + print("static inline%s struct fd_reg_pair\npack_%s(struct %s fields)\n{= " % + (depcrstr, prefix, prefix)) =20 self.dump_regpair_builder(reg) =20 @@ -253,8 +263,8 @@ class Bitset(object): (prefix, prefix, prefix, skip)) =20 =20 - def dump(self, prefix=3DNone): - if prefix =3D=3D None: + def dump(self, is_deprecated, prefix=3DNone): + if prefix is None: prefix =3D self.name for f in self.fields: if f.name: @@ -262,9 +272,9 @@ class Bitset(object): else: name =3D prefix =20 - if not f.name and f.low =3D=3D 0 and f.shr =3D=3D 0 and not f.type in [= "float", "fixed", "ufixed"]: + if not f.name and f.low =3D=3D 0 and f.shr =3D=3D 0 and f.type not in [= "float", "fixed", "ufixed"]: pass - elif f.type =3D=3D "boolean" or (f.type =3D=3D None and f.low =3D=3D f.= high): + elif f.type =3D=3D "boolean" or (f.type is None and f.low =3D=3D f.high= ): tab_to("#define %s" % name, "0x%08x" % (1 << f.low)) else: tab_to("#define %s__MASK" % name, "0x%08x" % mask(f.low, f.high)) @@ -286,6 +296,7 @@ class Array(object): self.domain =3D domain self.variant =3D variant self.parent =3D parent + self.children =3D [] if self.parent: self.name =3D self.parent.name + "_" + self.local_name else: @@ -337,12 +348,15 @@ class Array(object): offset +=3D self.parent.total_offset() return offset =20 - def dump(self): + def dump(self, is_deprecated): + depcrstr =3D "" + if is_deprecated: + depcrstr =3D " FD_DEPRECATED" proto =3D indices_varlist(self.indices()) strides =3D indices_strides(self.indices()) array_offset =3D self.total_offset() if self.fixed_offsets: - print("static inline uint32_t __offset_%s(%s idx)" % (self.local_name, = self.index_ctype())) + print("static inline%s uint32_t __offset_%s(%s idx)" % (depcrstr, self.= local_name, self.index_ctype())) print("{\n\tswitch (idx) {") if self.index_type: for val, offset in zip(self.index_type.names(), self.offsets): @@ -357,7 +371,7 @@ class Array(object): else: tab_to("#define REG_%s_%s(%s)" % (self.domain, self.name, proto), "(0x%= 08x + %s )\n" % (array_offset, strides)) =20 - def dump_pack_struct(self): + def dump_pack_struct(self, is_deprecated): pass =20 def dump_regpair_builder(self): @@ -373,6 +387,7 @@ class Reg(object): self.bit_size =3D bit_size if array: self.name =3D array.name + "_" + self.name + array.children.append(self) self.full_name =3D self.domain + "_" + self.name if "stride" in attrs: self.stride =3D int(attrs["stride"], 0) @@ -397,25 +412,34 @@ class Reg(object): else: return self.offset =20 - def dump(self): + def reg_offset(self): + if self.array: + offset =3D self.array.offset + self.offset + return "(0x%08x + 0x%x*__i)" % (offset, self.array.stride) + return "0x%08x" % self.offset + + def dump(self, is_deprecated): + depcrstr =3D "" + if is_deprecated: + depcrstr =3D " FD_DEPRECATED " proto =3D indices_prototype(self.indices()) strides =3D indices_strides(self.indices()) offset =3D self.total_offset() if proto =3D=3D '': tab_to("#define REG_%s" % self.full_name, "0x%08x" % offset) else: - print("static inline uint32_t REG_%s(%s) { return 0x%08x + %s; }" % (se= lf.full_name, proto, offset, strides)) + print("static inline%s uint32_t REG_%s(%s) { return 0x%08x + %s; }" % (= depcrstr, self.full_name, proto, offset, strides)) =20 if self.bitset.inline: - self.bitset.dump(self.full_name) + self.bitset.dump(is_deprecated, self.full_name) + print("") =20 - def dump_pack_struct(self): + def dump_pack_struct(self, is_deprecated): if self.bitset.inline: - self.bitset.dump_pack_struct(self) + self.bitset.dump_pack_struct(is_deprecated, self) =20 def dump_regpair_builder(self): - if self.bitset.inline: - self.bitset.dump_regpair_builder(self) + self.bitset.dump_regpair_builder(self) =20 def dump_py(self): print("\tREG_%s =3D 0x%08x" % (self.full_name, self.offset)) @@ -451,7 +475,7 @@ class Parser(object): =20 def prefix(self, variant=3DNone): if self.current_prefix_type =3D=3D "variant" and variant: - return variant + return sanitize_variant(variant) elif self.current_stripe: return self.current_stripe + "_" + self.current_domain elif self.current_prefix: @@ -497,15 +521,22 @@ class Parser(object): return varset =20 def parse_variants(self, attrs): - if not "variants" in attrs: + if "variants" not in attrs: return None - variant =3D attrs["variants"].split(",")[0] - if "-" in variant: - variant =3D variant[:variant.index("-")] =20 + variant =3D attrs["variants"].split(",")[0] varset =3D self.parse_varset(attrs) =20 - assert varset.has_name(variant) + if "-" in variant: + # if we have a range, validate that both the start and end + # of the range are valid enums: + start =3D variant[:variant.index("-")] + end =3D variant[variant.index("-") + 1:] + assert varset.has_name(start) + if end !=3D "": + assert varset.has_name(end) + else: + assert varset.has_name(variant) =20 return variant =20 @@ -569,9 +600,6 @@ class Parser(object): error_str =3D str(xmlschema.error_log.filter_from_errors()[0]) raise self.error("Schema validation failed for: " + filename + "\n" + = error_str) except ImportError as e: - if self.validate: - raise e - print("lxml not found, skipping validation", file=3Dsys.stderr) =20 def do_parse(self, filename): @@ -640,7 +668,7 @@ class Parser(object): elif name =3D=3D "domain": self.current_domain =3D attrs["name"] if "prefix" in attrs: - self.current_prefix =3D self.parse_variants(attrs) + self.current_prefix =3D sanitize_variant(self.parse_variants(attrs)) self.current_prefix_type =3D attrs["prefix"] else: self.current_prefix =3D None @@ -648,7 +676,7 @@ class Parser(object): if "varset" in attrs: self.current_varset =3D self.enums[attrs["varset"]] elif name =3D=3D "stripe": - self.current_stripe =3D self.parse_variants(attrs) + self.current_stripe =3D sanitize_variant(self.parse_variants(attrs)) elif name =3D=3D "enum": self.current_enum_value =3D 0 self.current_enum =3D Enum(attrs["name"]) @@ -696,6 +724,13 @@ class Parser(object): elif name =3D=3D "reg32": self.current_reg =3D None elif name =3D=3D "array": + # if the array has no Reg children, push an implicit reg32: + if len(self.current_array.children) =3D=3D 0: + attrs =3D { + "name": "REG", + "offset": "0", + } + self.parse_reg(attrs, 32) self.current_array =3D self.current_array.parent elif name =3D=3D "enum": self.current_enum =3D None @@ -711,10 +746,10 @@ class Parser(object): if variants: for variant, vreg in variants.items(): if reg =3D=3D vreg: - d[(usage, variant)].append(reg) + d[(usage, sanitize_variant(variant))].append(reg) else: for variant in self.variants: - d[(usage, variant)].append(reg) + d[(usage, sanitize_variant(variant))].append(reg) =20 print("#ifdef __cplusplus") =20 @@ -744,6 +779,9 @@ class Parser(object): =20 print("#endif") =20 + def has_variants(self, reg): + return reg.name in self.variant_regs and not is_number(reg.name) and not= is_number(reg.name[1:]) + def dump(self): enums =3D [] bitsets =3D [] @@ -757,7 +795,7 @@ class Parser(object): regs.append(e) =20 for e in enums + bitsets + regs: - e.dump() + e.dump(self.has_variants(e)) =20 self.dump_reg_usages() =20 @@ -773,8 +811,7 @@ class Parser(object): =20 =20 def dump_reg_variants(self, regname, variants): - # Don't bother for things that only have a single variant: - if len(variants) =3D=3D 1: + if is_number(regname) or is_number(regname[1:]): return print("#ifdef __cplusplus") print("struct __%s {" % regname) @@ -825,11 +862,20 @@ class Parser(object): xtravar =3D "__i, " print("__%s(%sstruct __%s fields) {" % (regname, xtra, regname)) for variant in variants.keys(): - print(" if (%s =3D=3D %s) {" % (varenum.upper(), variant)) + if "-" in variant: + start =3D variant[:variant.index("-")] + end =3D variant[variant.index("-") + 1:] + if end !=3D "": + print(" if ((%s >=3D %s) && (%s <=3D %s)) {" % (varenum.upper(), sta= rt, varenum.upper(), end)) + else: + print(" if (%s >=3D %s) {" % (varenum.upper(), start)) + else: + print(" if (%s =3D=3D %s) {" % (varenum.upper(), variant)) reg =3D variants[variant] reg.dump_regpair_builder() print(" } else") print(" assert(!\"invalid variant\");") + print(" return (struct fd_reg_pair){};") print("}") =20 if bit_size =3D=3D 64: @@ -842,7 +888,7 @@ class Parser(object): =20 def dump_structs(self): for e in self.file: - e.dump_pack_struct() + e.dump_pack_struct(self.has_variants(e)) =20 for regname in self.variant_regs: self.dump_reg_variants(regname, self.variant_regs[regname]) @@ -877,9 +923,20 @@ def dump_c(args, guard, func): print("#endif") print() =20 + print("#ifndef FD_NO_DEPRECATED_PACK") + print("#define FD_DEPRECATED __attribute__((deprecated))") + print("#else") + print("#define FD_DEPRECATED") + print("#endif") + print() + func(p) =20 - print("\n#endif /* %s */" % guard) + print() + print("#undef FD_DEPRECATED") + print() + + print("#endif /* %s */" % guard) =20 =20 def dump_c_defines(args): @@ -896,7 +953,7 @@ def dump_py_defines(args): p =3D Parser() =20 try: - p.parse(args.rnn, args.xml) + p.parse(args.rnn, args.xml, args.validate) except Error as e: print(e, file=3Dsys.stderr) exit(1) --=20 2.51.0