From ac280c223b42accf275f47ddf0c0bd597c73d619 Mon Sep 17 00:00:00 2001 From: "sgjesse@chromium.org" Date: Mon, 26 Oct 2009 12:26:42 +0000 Subject: [PATCH] Handle the list of code-stub types using macro expansion. As the list of code-stubs is used in two places it is now handled through a macro to keep this in sync. As some code-stubs is only used on ARM the list have been split into two parts to indicate this and get rid of dummy implementation on ia32 and x64 platforms. BUG=484 Review URL: http://codereview.chromium.org/335025 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3127 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/arm/regexp-macro-assembler-arm.cc | 1 + src/arm/regexp-macro-assembler-arm.h | 15 +++++++++ src/code-stubs.cc | 43 ++--------------------- src/code-stubs.h | 60 +++++++++++++++++++++------------ src/heap.cc | 1 + src/ia32/regexp-macro-assembler-ia32.cc | 4 --- src/regexp-macro-assembler.h | 16 --------- src/x64/regexp-macro-assembler-x64.cc | 5 --- 8 files changed, 59 insertions(+), 86 deletions(-) diff --git a/src/arm/regexp-macro-assembler-arm.cc b/src/arm/regexp-macro-assembler-arm.cc index 2e75a61..addc07d 100644 --- a/src/arm/regexp-macro-assembler-arm.cc +++ b/src/arm/regexp-macro-assembler-arm.cc @@ -29,6 +29,7 @@ #include "unicode.h" #include "log.h" #include "ast.h" +#include "code-stubs.h" #include "regexp-stack.h" #include "macro-assembler.h" #include "regexp-macro-assembler.h" diff --git a/src/arm/regexp-macro-assembler-arm.h b/src/arm/regexp-macro-assembler-arm.h index 0711ac1..f70bc05 100644 --- a/src/arm/regexp-macro-assembler-arm.h +++ b/src/arm/regexp-macro-assembler-arm.h @@ -260,6 +260,21 @@ class RegExpMacroAssemblerARM: public NativeRegExpMacroAssembler { }; +// Enter C code from generated RegExp code in a way that allows +// the C code to fix the return address in case of a GC. +// Currently only needed on ARM. +class RegExpCEntryStub: public CodeStub { + public: + RegExpCEntryStub() {} + virtual ~RegExpCEntryStub() {} + void Generate(MacroAssembler* masm); + + private: + Major MajorKey() { return RegExpCEntry; } + int MinorKey() { return 0; } + const char* GetName() { return "RegExpCEntryStub"; } +}; + #endif // V8_NATIVE_REGEXP diff --git a/src/code-stubs.cc b/src/code-stubs.cc index 586c948..73ff011 100644 --- a/src/code-stubs.cc +++ b/src/code-stubs.cc @@ -96,46 +96,9 @@ Handle CodeStub::GetCode() { const char* CodeStub::MajorName(CodeStub::Major major_key) { switch (major_key) { - case CallFunction: - return "CallFunction"; - case GenericBinaryOp: - return "GenericBinaryOp"; - case SmiOp: - return "SmiOp"; - case Compare: - return "Compare"; - case RecordWrite: - return "RecordWrite"; - case StackCheck: - return "StackCheck"; - case UnarySub: - return "UnarySub"; - case RevertToNumber: - return "RevertToNumber"; - case ToBoolean: - return "ToBoolean"; - case Instanceof: - return "Instanceof"; - case CounterOp: - return "CounterOp"; - case ArgumentsAccess: - return "ArgumentsAccess"; - case Runtime: - return "Runtime"; - case CEntry: - return "CEntry"; - case JSEntry: - return "JSEntry"; - case GetProperty: - return "GetProperty"; - case SetProperty: - return "SetProperty"; - case InvokeBuiltin: - return "InvokeBuiltin"; - case ConvertToDouble: - return "ConvertToDouble"; - case WriteInt32ToHeapNumber: - return "WriteInt32ToHeapNumber"; +#define DEF_CASE(name) case name: return #name; + CODE_STUB_LIST_ALL(DEF_CASE) +#undef DEF_CASE default: UNREACHABLE(); return NULL; diff --git a/src/code-stubs.h b/src/code-stubs.h index 91d951f..121140d 100644 --- a/src/code-stubs.h +++ b/src/code-stubs.h @@ -31,32 +31,50 @@ namespace v8 { namespace internal { +// List of code stubs used on all platforms. The order in this list is important +// as only the stubs up to and including RecordWrite allows nested stub calls. +#define CODE_STUB_LIST_ALL(V) \ + V(CallFunction) \ + V(GenericBinaryOp) \ + V(SmiOp) \ + V(Compare) \ + V(RecordWrite) \ + V(ConvertToDouble) \ + V(WriteInt32ToHeapNumber) \ + V(StackCheck) \ + V(UnarySub) \ + V(RevertToNumber) \ + V(ToBoolean) \ + V(Instanceof) \ + V(CounterOp) \ + V(ArgumentsAccess) \ + V(Runtime) \ + V(CEntry) \ + V(JSEntry) + +// List of code stubs only used on ARM platforms. +#ifdef V8_TARGET_ARCH_ARM +#define CODE_STUB_LIST_ARM(V) \ + V(GetProperty) \ + V(SetProperty) \ + V(InvokeBuiltin) \ + V(RegExpCEntry) +#else +#define CODE_STUB_LIST_ARM(V) +#endif + +// Combined list of code stubs. +#define CODE_STUB_LIST(V) \ + CODE_STUB_LIST_ALL(V) \ + CODE_STUB_LIST_ARM(V) // Stub is base classes of all stubs. class CodeStub BASE_EMBEDDED { public: enum Major { - CallFunction, - GenericBinaryOp, - SmiOp, - Compare, - RecordWrite, // Last stub that allows stub calls inside. - ConvertToDouble, - WriteInt32ToHeapNumber, - StackCheck, - UnarySub, - RevertToNumber, - ToBoolean, - Instanceof, - CounterOp, - ArgumentsAccess, - Runtime, - CEntry, - JSEntry, - GetProperty, // ARM only - SetProperty, // ARM only - InvokeBuiltin, // ARM only - RegExpCEntry, // ARM only +#define DEF_ENUM(name) name, + CODE_STUB_LIST(DEF_ENUM) +#undef DEF_ENUM NUMBER_OF_IDS }; diff --git a/src/heap.cc b/src/heap.cc index ac7c11c..c05734b 100644 --- a/src/heap.cc +++ b/src/heap.cc @@ -43,6 +43,7 @@ #include "v8threads.h" #if V8_TARGET_ARCH_ARM && V8_NATIVE_REGEXP #include "regexp-macro-assembler.h" +#include "arm/regexp-macro-assembler-arm.h" #endif namespace v8 { diff --git a/src/ia32/regexp-macro-assembler-ia32.cc b/src/ia32/regexp-macro-assembler-ia32.cc index 7af4e89..b878550 100644 --- a/src/ia32/regexp-macro-assembler-ia32.cc +++ b/src/ia32/regexp-macro-assembler-ia32.cc @@ -1163,10 +1163,6 @@ void RegExpMacroAssemblerIA32::LoadCurrentCharacterUnchecked(int cp_offset, } -void RegExpCEntryStub::Generate(MacroAssembler* masm_) { - __ int3(); // Unused on ia32. -} - #undef __ #endif // V8_NATIVE_REGEXP diff --git a/src/regexp-macro-assembler.h b/src/regexp-macro-assembler.h index 26aab2c..aa01096 100644 --- a/src/regexp-macro-assembler.h +++ b/src/regexp-macro-assembler.h @@ -215,22 +215,6 @@ class NativeRegExpMacroAssembler: public RegExpMacroAssembler { bool at_start); }; - -// Enter C code from generated RegExp code in a way that allows -// the C code to fix the return address in case of a GC. -// Currently only needed on ARM. -class RegExpCEntryStub: public CodeStub { - public: - RegExpCEntryStub() {} - virtual ~RegExpCEntryStub() {} - void Generate(MacroAssembler* masm); - - private: - Major MajorKey() { return RegExpCEntry; } - int MinorKey() { return 0; } - const char* GetName() { return "RegExpCEntryStub"; } -}; - #endif // V8_NATIVE_REGEXP } } // namespace v8::internal diff --git a/src/x64/regexp-macro-assembler-x64.cc b/src/x64/regexp-macro-assembler-x64.cc index 5d17a2d..d8dcc37 100644 --- a/src/x64/regexp-macro-assembler-x64.cc +++ b/src/x64/regexp-macro-assembler-x64.cc @@ -1287,11 +1287,6 @@ void RegExpMacroAssemblerX64::LoadCurrentCharacterUnchecked(int cp_offset, } } - -void RegExpCEntryStub::Generate(MacroAssembler* masm_) { - __ int3(); // Unused on x64. -} - #undef __ #endif // V8_NATIVE_REGEXP -- 2.7.4