If you control the code, the easiest way is to :
- add runtime profiling functions directly inside the generated code (for example, one before each function call and sequencing construct)
- hardcode into your profiling functions the fact that, after a certain number of steps, excecution should be aborted.

Example :

  let count = ref 0
  let max_count = 100 (* you choose that constant during generation *)
  exception Terminated
  let step () =
    incr count;
    if !count > max_count then raise Terminated

  (* generated code *)
  let code () =
    ... ; step (); ...; step () ; ...

You could probably also have max_count passed as a parameter at execution time (allowing you to execute the same generated code with different time limits).