summaryrefslogtreecommitdiffstats
path: root/js/src/wasm/WasmFrameIterator.h
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/wasm/WasmFrameIterator.h')
-rw-r--r--js/src/wasm/WasmFrameIterator.h142
1 files changed, 142 insertions, 0 deletions
diff --git a/js/src/wasm/WasmFrameIterator.h b/js/src/wasm/WasmFrameIterator.h
new file mode 100644
index 000000000..a62a2d3ee
--- /dev/null
+++ b/js/src/wasm/WasmFrameIterator.h
@@ -0,0 +1,142 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+ * vim: set ts=8 sts=4 et sw=4 tw=99:
+ *
+ * Copyright 2014 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef wasm_frame_iterator_h
+#define wasm_frame_iterator_h
+
+#include "js/ProfilingFrameIterator.h"
+
+class JSAtom;
+
+namespace js {
+
+class WasmActivation;
+namespace jit { class MacroAssembler; }
+
+namespace wasm {
+
+class CallSite;
+class Code;
+class CodeRange;
+class SigIdDesc;
+struct CallThunk;
+struct FuncOffsets;
+struct ProfilingOffsets;
+struct TrapOffset;
+
+// Iterates over the frames of a single WasmActivation, called synchronously
+// from C++ in the thread of the asm.js.
+//
+// The one exception is that this iterator may be called from the interrupt
+// callback which may be called asynchronously from asm.js code; in this case,
+// the backtrace may not be correct. That being said, we try our best printing
+// an informative message to the user and at least the name of the innermost
+// function stack frame.
+class FrameIterator
+{
+ const WasmActivation* activation_;
+ const Code* code_;
+ const CallSite* callsite_;
+ const CodeRange* codeRange_;
+ uint8_t* fp_;
+ uint8_t* pc_;
+ bool missingFrameMessage_;
+
+ void settle();
+
+ public:
+ explicit FrameIterator();
+ explicit FrameIterator(const WasmActivation& activation);
+ void operator++();
+ bool done() const;
+ const char* filename() const;
+ const char16_t* displayURL() const;
+ bool mutedErrors() const;
+ JSAtom* functionDisplayAtom() const;
+ unsigned lineOrBytecode() const;
+ inline void* fp() const { return fp_; }
+ inline uint8_t* pc() const { return pc_; }
+};
+
+// An ExitReason describes the possible reasons for leaving compiled wasm code
+// or the state of not having left compiled wasm code (ExitReason::None).
+enum class ExitReason : uint32_t
+{
+ None, // default state, the pc is in wasm code
+ ImportJit, // fast-path call directly into JIT code
+ ImportInterp, // slow-path call into C++ Invoke()
+ Native, // call to native C++ code (e.g., Math.sin, ToInt32(), interrupt)
+ Trap // call to trap handler for the trap in WasmActivation::trap
+};
+
+// Iterates over the frames of a single WasmActivation, given an
+// asynchrously-interrupted thread's state. If the activation's
+// module is not in profiling mode, the activation is skipped.
+class ProfilingFrameIterator
+{
+ const WasmActivation* activation_;
+ const Code* code_;
+ const CodeRange* codeRange_;
+ uint8_t* callerFP_;
+ void* callerPC_;
+ void* stackAddress_;
+ ExitReason exitReason_;
+
+ void initFromFP();
+
+ public:
+ ProfilingFrameIterator();
+ explicit ProfilingFrameIterator(const WasmActivation& activation);
+ ProfilingFrameIterator(const WasmActivation& activation,
+ const JS::ProfilingFrameIterator::RegisterState& state);
+ void operator++();
+ bool done() const { return !codeRange_; }
+
+ void* stackAddress() const { MOZ_ASSERT(!done()); return stackAddress_; }
+ const char* label() const;
+};
+
+// Prologue/epilogue code generation
+
+void
+GenerateExitPrologue(jit::MacroAssembler& masm, unsigned framePushed, ExitReason reason,
+ ProfilingOffsets* offsets);
+void
+GenerateExitEpilogue(jit::MacroAssembler& masm, unsigned framePushed, ExitReason reason,
+ ProfilingOffsets* offsets);
+void
+GenerateFunctionPrologue(jit::MacroAssembler& masm, unsigned framePushed, const SigIdDesc& sigId,
+ FuncOffsets* offsets);
+void
+GenerateFunctionEpilogue(jit::MacroAssembler& masm, unsigned framePushed, FuncOffsets* offsets);
+
+// Runtime patching to enable/disable profiling
+
+void
+ToggleProfiling(const Code& code, const CallSite& callSite, bool enabled);
+
+void
+ToggleProfiling(const Code& code, const CallThunk& callThunk, bool enabled);
+
+void
+ToggleProfiling(const Code& code, const CodeRange& codeRange, bool enabled);
+
+} // namespace wasm
+} // namespace js
+
+#endif // wasm_frame_iterator_h