Index: src/x64/codegen-x64.cc |
diff --git a/src/x64/codegen-x64.cc b/src/x64/codegen-x64.cc |
index 44e1618c319b5abe542cb183618bb05598523235..a1140158dbee2df874bd43747496a7c34d8b7732 100644 |
--- a/src/x64/codegen-x64.cc |
+++ b/src/x64/codegen-x64.cc |
@@ -31,6 +31,70 @@ void StubRuntimeCallHelper::AfterCall(MacroAssembler* masm) const { |
#define __ masm. |
+#ifdef _WIN64 |
+ |
cpu_(ooo_6.6-7.5)
2014/09/26 20:35:31
can you copy the definition of UndwinIfo from
Mic
|
+struct UnwindInfo { |
+ unsigned char version : 3; |
+ unsigned char flags : 5; |
+ unsigned char size_of_prolog; |
+ unsigned char count_of_codes; |
+ unsigned frame_register : 4; |
+ unsigned frame_offset : 4; |
+ Address exception_handler; |
+ Address exception_data; |
+}; |
+ |
+struct ExceptionTableEntry { |
+ char trampoline[16]; |
+ ::RUNTIME_FUNCTION runtime_function; |
+ UnwindInfo unwind_info; |
+}; |
+ |
+void InstallExceptionFilter(Isolate* isolate, |
+ WinExceptionFilter exception_filter) { |
+ CHECK(exception_filter); |
+ MemoryChunk* chunk = isolate->memory_allocator()->AllocateChunk( |
+ sizeof(ExceptionTableEntry), sizeof(ExceptionTableEntry), |
+ EXECUTABLE, NULL); |
+ CHECK(chunk && chunk->address()); |
+ byte* buffer = chunk->area_start(); |
+ MacroAssembler masm(NULL, buffer, chunk->area_size()); |
+ |
+ __ Jump(reinterpret_cast<Address>(exception_filter), |
+ RelocInfo::EXTERNAL_REFERENCE); |
cpu_(ooo_6.6-7.5)
2014/09/26 17:03:51
what is ^^ that?
jochen (gone - plz use gerrit)
2014/09/26 17:25:31
this emits a jump to the breakpad exception filter
cpu_(ooo_6.6-7.5)
2014/09/26 20:35:31
Acknowledged.
|
+ |
+ CodeDesc desc; |
+ masm.GetCode(&desc); |
+ DCHECK(!RelocInfo::RequiresRelocation(desc)); |
+ |
+ ExceptionTableEntry* table_entry = |
+ reinterpret_cast<ExceptionTableEntry*>(buffer); |
+ table_entry->runtime_function.BeginAddress = 0; |
cpu_(ooo_6.6-7.5)
2014/09/26 17:03:51
is that begin address absolute?
jochen (gone - plz use gerrit)
2014/09/26 17:25:31
no, all addresses are 32bit offsets to the start o
cpu_(ooo_6.6-7.5)
2014/09/26 20:35:31
Acknowledged.
|
+ table_entry->runtime_function.EndAddress = |
+ static_cast<DWORD>(isolate->code_range()->size()); |
+ table_entry->runtime_function.UnwindData = |
+ reinterpret_cast<Address>(&table_entry->unwind_info) - |
+ isolate->code_range()->start(); |
+ |
+ table_entry->unwind_info.version = 1; |
+ table_entry->unwind_info.flags = UNW_FLAG_EHANDLER; |
+ table_entry->unwind_info.size_of_prolog = 0; |
+ table_entry->unwind_info.count_of_codes = 0; |
+ table_entry->unwind_info.frame_register = 0; |
+ table_entry->unwind_info.frame_offset = 0; |
+ table_entry->unwind_info.exception_handler = reinterpret_cast<Address>( |
+ reinterpret_cast<Address>(&table_entry->trampoline) - |
+ isolate->code_range()->start()); |
+ table_entry->unwind_info.exception_data = 0; |
+ |
+ CpuFeatures::FlushICache(buffer, chunk->area_size()); |
+ base::OS::ProtectCode(buffer, chunk->area_size()); |
+ |
+ CHECK(RtlAddFunctionTable( |
+ &table_entry->runtime_function, 1, |
+ reinterpret_cast<DWORD64>(isolate->code_range()->start()))); |
+} |
+#endif |
UnaryMathFunction CreateExpFunction() { |
if (!FLAG_fast_math) return &std::exp; |