mirror of
https://github.com/Mercury-Language/mercury.git
synced 2025-12-16 22:35:41 +00:00
Fix some bugs in my previous diff that optimized away stack slots storing
Estimated hours taken: 8 Branches: main Fix some bugs in my previous diff that optimized away stack slots storing dummy values that manifested themselves as warnings from the C compiler about integers too big to fit into 8 or 16 bits being implicitly truncated. They did not lead to the failure of any test case, since it doesn't matter whether the debugger gets the values it ignores (I/O states or stores) from valid stack slots or not. When generating RTTI for gc and the debugger, the compiler had three places that generated references to stack slots: the return sites of calls, resume points, and trace events. The previous diff updated only the first of these. This diff updates the other two, and ensures there are no more. Since the debugger needs to know whether a procedure has a pair of I/O state arguments (e.g. when performing a retry), we add a field to proc layouts to hold this information. runtime/mercury_grade.h: Increment the debug grade runtime compatibility version number to reflect the change in layout structures. runtime/mercury_stack_layout.h: Add an extra field to proc layouts to specify flags. At the moment, the only flag says whether the procedure has a pair of I/O state arguments. Add an extra field to proc layouts to specify the trace level of a procedure. This used to be the same as the module's trace level, but one of my bug fixes a couple of months ago broke that link. We don't yet use this field, but it makes sense to do it at the same time as the increment of the compatibility version number. compiler/continuation_info.m: Attach to every description of a live value a description of where in the compiler that description was created. Rename the type involved to avoid an ambiguity. Ignore dummy types when generating resume layouts. Add some sanity checks. Add new fields to the continuation_info data structure to allow stack_layout.m to fill in the new fields in proc layout structures. compiler/trace.m: Do not generate references to dummy values at trace events, except at call ports. At those ports, all live variables should be in registers. compiler/stack_layout.m: Make the check for whether a value fits into an unsigned 8 bit value a direct rather than an indirect one. The indirect one assumed that stack slot numbers are all positive, which is now a bad assumption. Check for negative stack slot numbers in all RTTI stack slot descriptions. Fill in the two new slots in proc layout structures. compiler/layout.m: Reserve space for the two new slots in proc layout structures. compiler/layout_out.m: Output the two new slots in proc layout structures. compiler/code_gen.m: Preserve the information needed by stack_layout.m for the two new fields. compiler/llds_out.m: Add some code that ensures that we never output an integer constant that doesn't fit into the range of its type. Since this code is executed many millions of times, it is designed to be enabled only when the checking is manually enabled. It is normally off, but I got a clean bootcheck in the debug grade (which is the best stress test) with it enabled. compiler/trace_params.m: Update a comment. compiler/code_info.m: Export a function for use by trace.m. compiler/hlds_pred.m: Export a predicate for use by stack_layout.m. compiler/Mercury.options: Enable inlining for llds_out.m, to get rid of the sanity checking overhead if it is not enabled. tests/debugger/completion.exp*: tests/debugger/interpreter.exp*: tests/debugger/multi_parameter.exp*: tests/debugger/queens.exp*: tests/debugger/print_goal.exp*: tests/debugger/tabled_read.exp*: tests/debugger/tabled_read_decl.exp*: tests/debugger/declarative/io_stream_test.exp*: tests/debugger/declarative/tabled_read_decl.exp*: Update these expected output files to not expect dummy values that aren't kept anymore.
This commit is contained in:
@@ -332,6 +332,7 @@ generate_proc_code(PredInfo, ProcInfo0, ProcId, PredId, ModuleInfo0,
|
||||
proc_info_get_initial_instmap(ProcInfo, ModuleInfo, InstMap0),
|
||||
proc_info_headvars(ProcInfo, HeadVars),
|
||||
proc_info_varset(ProcInfo, VarSet),
|
||||
proc_info_argmodes(ProcInfo, ArgModes),
|
||||
proc_info_vartypes(ProcInfo, VarTypes),
|
||||
globals__get_trace_suppress(Globals, TraceSuppress),
|
||||
(
|
||||
@@ -342,7 +343,6 @@ generate_proc_code(PredInfo, ProcInfo0, ProcId, PredId, ModuleInfo0,
|
||||
;
|
||||
MaybeGoal = no
|
||||
),
|
||||
IsBeingTraced = bool__not(EffTraceIsNone),
|
||||
NeedsAllNames = eff_trace_needs_all_var_names(PredInfo,
|
||||
ProcInfo, TraceLevel, TraceSuppress),
|
||||
proc_info_get_maybe_deep_profile_info(ProcInfo,
|
||||
@@ -356,12 +356,14 @@ generate_proc_code(PredInfo, ProcInfo0, ProcId, PredId, ModuleInfo0,
|
||||
MaybeHLDSDeepInfo = no,
|
||||
MaybeDeepProfInfo = no
|
||||
),
|
||||
EffTraceLevel = eff_trace_level(PredInfo, ProcInfo,
|
||||
TraceLevel),
|
||||
ProcLayout = proc_layout_info(RttiProcLabel, EntryLabel,
|
||||
Detism, TotalSlots, MaybeSuccipSlot, EvalMethod,
|
||||
MaybeTraceCallLabel, MaxTraceReg, HeadVars, MaybeGoal,
|
||||
InstMap0, TraceSlotInfo, ForceProcId, VarSet, VarTypes,
|
||||
InternalMap, MaybeTableInfo, IsBeingTraced,
|
||||
NeedsAllNames, MaybeDeepProfInfo),
|
||||
EffTraceLevel, MaybeTraceCallLabel, MaxTraceReg,
|
||||
HeadVars, ArgModes, MaybeGoal, InstMap0, TraceSlotInfo,
|
||||
ForceProcId, VarSet, VarTypes, InternalMap,
|
||||
MaybeTableInfo, NeedsAllNames, MaybeDeepProfInfo),
|
||||
global_data_add_new_proc_layout(proc(PredId, ProcId),
|
||||
ProcLayout, !GlobalData)
|
||||
;
|
||||
|
||||
Reference in New Issue
Block a user