Skip to content

Commit 9032bb4

Browse files
committed
Add linemarks test, address issues found by it
1 parent 66c2d4b commit 9032bb4

File tree

8 files changed

+516
-11
lines changed

8 files changed

+516
-11
lines changed

doc/1.4/running-dmlc.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,11 @@ causes generated C code to follow the DML code more closely.
115115

116116
Adds Synopsys® Coverity® analysis annotations to suppress common false positives
117117
in generated C code created from DML 1.4 device models.
118+
119+
Analysis annotation generation impacts the generation of line directives in a
120+
way that may cause debugging or coverage tools besides Coverity to display
121+
unexpected behavior. Because of this, it's recommended that `--coverity` is
122+
only used when needed.
118123
</dd><dt>
119124

120125
--warn=*tag*

py/dml/c_backend.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1874,7 +1874,7 @@ def generate_init_data_objs(device):
18741874
else:
18751875
markers = ([('store_writes_const_field', 'FALSE')]
18761876
if deep_const(node._type) else [])
1877-
coverity_markers(markers, node.site)
1877+
coverity_markers(markers, init.site)
18781878
init.assign_to(nref, node._type)
18791879
else:
18801880
index_exprs = ()
@@ -1888,7 +1888,7 @@ def generate_init_data_objs(device):
18881888
with allow_linemarks():
18891889
markers = ([('store_writes_const_field', 'FALSE')]
18901890
if deep_const(node._type) else [])
1891-
coverity_markers(markers, node.site)
1891+
coverity_markers(markers, init.site)
18921892
init.assign_to(nref, node._type)
18931893
for _ in range(node.dimensions):
18941894
out('}\n', postindent=-1)
@@ -2153,7 +2153,7 @@ def generate_trait_method(m):
21532153
out('/* %s */\n' % (str(m),))
21542154
start_function_definition(m.declaration())
21552155
with allow_linemarks():
2156-
site_linemark(m.site)
2156+
site_linemark(m.astbody.site)
21572157
out('{\n', postindent=1)
21582158
code.toc_inline()
21592159
site_linemark(m.rbrace_site)

py/dml/codegen.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1925,7 +1925,9 @@ def codegen_statements(trees, *args):
19251925
return stmts
19261926

19271927
def codegen_statement(tree, *args):
1928-
return mkCompound(tree.site, codegen_statements([tree], *args))
1928+
rbrace_site = tree.args[1] if tree.kind == 'compound' else None
1929+
return mkCompound(tree.site, codegen_statements([tree], *args),
1930+
rbrace_site)
19291931

19301932
@statement_dispatcher
19311933
def stmt_compound(stmt, location, scope):
@@ -3576,7 +3578,7 @@ def codegen_inline(site, meth_node, indices, inargs, outargs,
35763578
else:
35773579
param_scope.add_variable(parmname,
35783580
type = parmtype or arg.ctype(),
3579-
site = meth_node.site,
3581+
site = arg.site,
35803582
init = ExpressionInitializer(arg))
35813583
arg.decref()
35823584

py/dml/ctree.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -736,6 +736,10 @@ def __init__(self, site, cond, truebranch, falsebranch, else_site):
736736
assert_type(site, truebranch, Statement)
737737
assert_type(site, falsebranch, (Statement, type(None)))
738738
def toc_stmt(self):
739+
# When needed as a single statement, if-else statements are wrapped in
740+
# braces. This is to avoid ambiguity in generated C if this if-else is
741+
# used as branch of another if-else, which GCC would otherwise complain
742+
# about
739743
site_linemark(self.site)
740744
out('{\n',postindent=1)
741745
self.toc_inline()
@@ -4826,6 +4830,9 @@ def __str__(self):
48264830
return "%s" % self.expr
48274831
def __repr__(self):
48284832
return "ExpressionInitializer(%r)" % self.expr
4833+
@property
4834+
def site(self):
4835+
return self.expr.site
48294836
def incref(self):
48304837
self.expr.incref()
48314838
def decref(self):
@@ -5034,7 +5041,7 @@ def toc(self):
50345041
# ducks a potential GCC warning, and also serves to
50355042
# zero-initialize VLAs
50365043
self.type.print_declaration(self.name, unused = self.unused)
5037-
self.linemark()
5044+
site_linemark(self.init.site)
50385045
self.init.assign_to(mkLit(self.site, self.name, self.type),
50395046
self.type)
50405047
else:
@@ -5100,7 +5107,11 @@ def toc(self):
51005107
if dml.globals.linemarks:
51015108
linemark(self.site.lineno, path)
51025109
out(self.text)
5103-
out('\n#undef %s\n' % (ident,))
5110+
if not output.current().bol:
5111+
out('\n')
5112+
if dml.globals.linemarks:
5113+
reset_line_directive()
5114+
out('#undef %s\n' % (ident,))
51045115

51055116
mkCText = CText
51065117

py/dml/traits.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -221,15 +221,15 @@ def codegen_body(self):
221221
if not self.independent else contextlib.nullcontext()):
222222
scope = MethodParamScope(self.trait.scope(global_scope))
223223
implicit_inargs = self.vtable_trait.implicit_args()
224-
site = self.site
224+
site = SimpleSite(self.site.loc())
225225
if self.default_trait:
226226
default_method = self.default_trait.method_impls[self.name]
227227
[(name, typ)] = implicit_inargs
228228
default = ExpressionSymbol(
229229
'default',
230230
TraitMethodDirect(
231231
default_method.site,
232-
mkLit(self.site, cident(name), typ),
232+
mkLit(site, cident(name), typ),
233233
default_method),
234234
site)
235235
else:
@@ -239,7 +239,7 @@ def codegen_body(self):
239239
for (n, t) in self.outp:
240240
# See SIMICS-19028
241241
if deep_const(t):
242-
raise ICE(site,
242+
raise ICE(self.site,
243243
'Methods with (partially) const output/return '
244244
+ 'values are not yet supported.')
245245

@@ -249,7 +249,7 @@ def codegen_body(self):
249249
else:
250250
memoization = None
251251
body = codegen_method(
252-
self.site, self.inp, self.outp, self.throws, self.independent,
252+
self.astbody.site, self.inp, self.outp, self.throws, self.independent,
253253
memoization, self.astbody, default,
254254
Location(dml.globals.device, ()), scope, self.rbrace_site)
255255

spelling-passlist

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,6 @@ PCHANGE *
2020
PCONSTANT *
2121
PPARAMETER *
2222
poverride *
23+
qualifies *
24+
prescriptive *
25+
delimits *

0 commit comments

Comments
 (0)