diff --git a/src/sixtypical/callgraph.py b/src/sixtypical/callgraph.py index 44990d2..b3a87db 100644 --- a/src/sixtypical/callgraph.py +++ b/src/sixtypical/callgraph.py @@ -33,6 +33,8 @@ def construct_callgraph(program): potential_calls = node['potentially-calls'] if routine.name in potential_calls: potentially_called_by.append(name) + if getattr(routine, 'explicitly_marked_as_called', None) or routine.name == 'main': + potentially_called_by.append('*marked*') graph[routine.name]['potentially-called-by'] = potentially_called_by return graph diff --git a/tests/SixtyPical Callgraph.md b/tests/SixtyPical Callgraph.md index 5caf5f8..aeee12b 100644 --- a/tests/SixtyPical Callgraph.md +++ b/tests/SixtyPical Callgraph.md @@ -10,14 +10,112 @@ called. -> Tests for functionality "Dump callgraph info for SixtyPical program" -The `main` routine is always called. +The `main` routine is always called. The thing that it will +be called by is the system, but the callgraph analyzer will +simply consider it to be "marked as called". | define main routine | { | } = { = "main": { + = "potentially-called-by": [ + = "*marked*" + = ], + = "potentially-calls": [] + = } + = } + +If a routine is called by another routine, this fact will be noted. + + | define main routine + | { + | call other + | } + | + | define other routine + | { + | } + = { + = "main": { + = "potentially-called-by": [ + = "*marked*" + = ], + = "potentially-calls": [ + = "other" + = ] + = }, + = "other": { + = "potentially-called-by": [ + = "main" + = ], + = "potentially-calls": [] + = } + = } + +If a routine is not called by another routine, and it is not `main` +and it is not explicitly marked as preserved, this absence will be +noted, and a compiler or linker will be permitted to omit it from +the final executable. + + | define main routine + | { + | } + | + | define other routine + | { + | } + = { + = "main": { + = "potentially-called-by": [ + = "*marked*" + = ], + = "potentially-calls": [] + = }, + = "other": { = "potentially-called-by": [], = "potentially-calls": [] = } = } + +If two routines potentially call each other, this will be noted, +even if nothing else potentially calls either of those routines. +This may change in the future. + + | define main routine + | { + | } + | + | define other1 routine + | { + | call other2 + | } + | + | define other2 routine + | { + | call other1 + | } + = { + = "main": { + = "potentially-called-by": [ + = "*marked*" + = ], + = "potentially-calls": [] + = }, + = "other1": { + = "potentially-called-by": [ + = "other2" + = ], + = "potentially-calls": [ + = "other2" + = ] + = }, + = "other2": { + = "potentially-called-by": [ + = "other1" + = ], + = "potentially-calls": [ + = "other1" + = ] + = } + = }