emit_insn (insns);
}
+#if TARGET_TPF != 0
if (TARGET_TPF_PROFILING)
{
- /* Generate a BAS instruction to serve as a function
- entry intercept to facilitate the use of tracing
- algorithms located at the branch target. */
- emit_insn (gen_prologue_tpf ());
+ /* Generate a BAS instruction to serve as a function entry
+ intercept to facilitate the use of tracing algorithms located
+ at the branch target. */
+ emit_insn (gen_prologue_tpf (
+ GEN_INT (s390_tpf_trace_hook_prologue_check),
+ GEN_INT (s390_tpf_trace_hook_prologue_target)));
- /* Emit a blockage here so that all code
- lies between the profiling mechanisms. */
+ /* Emit a blockage here so that all code lies between the
+ profiling mechanisms. */
emit_insn (gen_blockage ());
}
+#endif
}
/* Expand the epilogue into a bunch of separate insns. */
int next_offset;
int i;
+#if TARGET_TPF != 0
if (TARGET_TPF_PROFILING)
{
+ /* Generate a BAS instruction to serve as a function entry
+ intercept to facilitate the use of tracing algorithms located
+ at the branch target. */
- /* Generate a BAS instruction to serve as a function
- entry intercept to facilitate the use of tracing
- algorithms located at the branch target. */
-
- /* Emit a blockage here so that all code
- lies between the profiling mechanisms. */
+ /* Emit a blockage here so that all code lies between the
+ profiling mechanisms. */
emit_insn (gen_blockage ());
- emit_insn (gen_epilogue_tpf ());
+ emit_insn (gen_epilogue_tpf (
+ GEN_INT (s390_tpf_trace_hook_epilogue_check),
+ GEN_INT (s390_tpf_trace_hook_epilogue_target)));
}
+#endif
/* Check whether to use frame or stack pointer for restore. */
if (!DISP_IN_RANGE ((1 << param_stack_clash_protection_probe_interval)))
param_stack_clash_protection_probe_interval = 12;
+#if TARGET_TPF != 0
+ if (!CONST_OK_FOR_J (opts->x_s390_tpf_trace_hook_prologue_check))
+ error ("-mtpf-trace-hook-prologue-check requires integer in range 0..4095");
+
+ if (!CONST_OK_FOR_J (opts->x_s390_tpf_trace_hook_prologue_target))
+ error ("-mtpf-trace-hook-prologue-target requires integer in range 0..4095");
+
+ if (!CONST_OK_FOR_J (opts->x_s390_tpf_trace_hook_epilogue_check))
+ error ("-mtpf-trace-hook-epilogue-check requires integer in range 0..4095");
+
+ if (!CONST_OK_FOR_J (opts->x_s390_tpf_trace_hook_epilogue_target))
+ error ("-mtpf-trace-hook-epilogue-target requires integer in range 0..4095");
+
+ if (s390_tpf_trace_skip)
+ {
+ opts->x_s390_tpf_trace_hook_prologue_target = TPF_TRACE_PROLOGUE_SKIP_TARGET;
+ opts->x_s390_tpf_trace_hook_epilogue_target = TPF_TRACE_EPILOGUE_SKIP_TARGET;
+ }
+#endif
+
#ifdef TARGET_DEFAULT_LONG_DOUBLE_128
if (!TARGET_LONG_DOUBLE_128_P (opts_set->x_target_flags))
opts->x_target_flags |= MASK_LONG_DOUBLE_128;
/* GAS supports it, but the debuggers don't, so avoid it. */
#define SUPPORTS_DISCRIMINATOR 0
+/* z/TPF hardcoded values for the -mtpf-trace feature. */
+
+/* The *_CHECK value specify addresses in the lowcore whose byte
+ values can be used to turn on/off the tracing. */
+#define TPF_TRACE_PROLOGUE_CHECK 4065
+#define TPF_TRACE_EPILOGUE_CHECK 4071
+
+/* The target addresses for the z/TPF trace facility. */
+#define TPF_TRACE_PROLOGUE_TARGET 4064
+#define TPF_TRACE_EPILOGUE_TARGET 4070
+
+/* Alternate target addresses for the z/TPF trace facility. These
+ will be used with the -mtpf-trace-skip switch. */
+#define TPF_TRACE_PROLOGUE_SKIP_TARGET 4076
+#define TPF_TRACE_EPILOGUE_SKIP_TARGET 4082
+
#endif /* ! _TPF_H */
;; <http://www.gnu.org/licenses/>.
(define_insn "prologue_tpf"
- [(unspec_volatile [(const_int 0)] UNSPECV_TPF_PROLOGUE)
+ [(unspec_volatile [(match_operand 0 "const_int_operand" "J")
+ (match_operand 1 "const_int_operand" "J")]
+ UNSPECV_TPF_PROLOGUE)
(clobber (reg:DI 1))]
"TARGET_TPF_PROFILING"
- "larl\t%%r1,.+14\;tm\t4065,255\;bnz\t4064"
+ "larl\t%%r1,.+14\;tm\t%0,255\;bnz\t%1"
[(set_attr "length" "14")])
(define_insn "epilogue_tpf"
- [(unspec_volatile [(const_int 0)] UNSPECV_TPF_EPILOGUE)
+ [(unspec_volatile [(match_operand 0 "const_int_operand" "J")
+ (match_operand 1 "const_int_operand" "J")]
+ UNSPECV_TPF_EPILOGUE)
(clobber (reg:DI 1))]
"TARGET_TPF_PROFILING"
- "larl\t%%r1,.+14\;tm\t4071,255\;bnz\t4070"
+ "larl\t%%r1,.+14\;tm\t%0,255\;bnz\t%1"
[(set_attr "length" "14")])
Target Report Mask(TPF_PROFILING)
Enable TPF-OS tracing code.
+mtpf-trace-hook-prologue-check=
+Target RejectNegative Report Joined UInteger Var(s390_tpf_trace_hook_prologue_check) Init(TPF_TRACE_PROLOGUE_CHECK)
+Set the trace check address for prologue tpf hook
+
+mtpf-trace-hook-prologue-target=
+Target RejectNegative Report Joined UInteger Var(s390_tpf_trace_hook_prologue_target) Init(TPF_TRACE_PROLOGUE_TARGET)
+Set the trace jump address for prologue tpf hook
+
+mtpf-trace-hook-epilogue-check=
+Target RejectNegative Report Joined UInteger Var(s390_tpf_trace_hook_epilogue_check) Init(TPF_TRACE_EPILOGUE_CHECK)
+Set the trace check address for epilogue tpf hook
+
+mtpf-trace-hook-epilogue-target=
+Target RejectNegative Report Joined UInteger Var(s390_tpf_trace_hook_epilogue_target) Init(TPF_TRACE_EPILOGUE_TARGET)
+Set the trace jump address for epilogue tpf hook
+
+mtpf-trace-skip
+Target Report Var(s390_tpf_trace_skip) Init(0)
+Set the prologue and epilogue hook addresses to TPF_TRACE_PROLOGUE_SKIP_TARGET and TPF_TRACE_EPILOGUE_SKIP_TARGET. Equivalent to using -mtpf-trace-hook-prologue-target=TPF_TRACE_PROLOGUE_SKIP_TARGET and -mtpf-trace-hook-epilogue-target=TPF_TRACE_EPILOGUE_SKIP_TARGET
+
mmain
Target Report
Specify main object for TPF-OS.
-msmall-exec -mno-small-exec -mmvcle -mno-mvcle @gol
-m64 -m31 -mdebug -mno-debug -mesa -mzarch @gol
-mhtm -mvx -mzvector @gol
--mtpf-trace -mno-tpf-trace -mfused-madd -mno-fused-madd @gol
+-mtpf-trace -mno-tpf-trace -mtpf-trace-skip -mno-tpf-trace-skip @gol
+-mfused-madd -mno-fused-madd @gol
-mwarn-framesize -mwarn-dynamicstack -mstack-size -mstack-guard @gol
-mhotpatch=@var{halfwords},@var{halfwords}}
routines in the operating system. This option is off by default, even
when compiling for the TPF OS@.
+@item -mtpf-trace-skip
+@itemx -mno-tpf-trace-skip
+@opindex mtpf-trace-skip
+@opindex mno-tpf-trace-skip
+Generate code that changes (does not change) the default branch
+targets enabled by @option{-mtpf-trace} to point to specialized trace
+routines providing the ability of selectively skipping function trace
+entries for the TPF OS. This option is off by default, even when
+compiling for the TPF OS and specifying @option{-mtpf-trace}.
+
@item -mfused-madd
@itemx -mno-fused-madd
@opindex mfused-madd