Revision: 3454
Author: [email protected]
Date: Fri Dec 11 02:40:01 2009
Log: Give the binary op stubs better names to make profiles more
informative.
Review URL: http://codereview.chromium.org/488017
http://code.google.com/p/v8/source/detail?r=3454
Modified:
/branches/bleeding_edge/src/arm/codegen-arm.cc
/branches/bleeding_edge/src/arm/codegen-arm.h
/branches/bleeding_edge/src/bootstrapper.cc
/branches/bleeding_edge/src/bootstrapper.h
/branches/bleeding_edge/src/ia32/codegen-ia32.cc
/branches/bleeding_edge/src/ia32/codegen-ia32.h
/branches/bleeding_edge/src/token.cc
/branches/bleeding_edge/src/token.h
/branches/bleeding_edge/src/x64/codegen-x64.cc
/branches/bleeding_edge/src/x64/codegen-x64.h
=======================================
--- /branches/bleeding_edge/src/arm/codegen-arm.cc Wed Dec 9 03:14:45 2009
+++ /branches/bleeding_edge/src/arm/codegen-arm.cc Fri Dec 11 02:40:01 2009
@@ -5678,6 +5678,29 @@
*required_shift = 0;
}
}
+
+
+const char* GenericBinaryOpStub::GetName() {
+ if (name_ != NULL) return name_;
+ const int len = 100;
+ name_ = Bootstrapper::AllocateAutoDeletedArray(len);
+ if (name_ == NULL) return "OOM";
+ const char* op_name = Token::Name(op_);
+ const char* overwrite_name;
+ switch (mode_) {
+ case NO_OVERWRITE: overwrite_name = "Alloc"; break;
+ case OVERWRITE_RIGHT: overwrite_name = "OverwriteRight"; break;
+ case OVERWRITE_LEFT: overwrite_name = "OverwriteLeft"; break;
+ default: overwrite_name = "UnknownOverwrite"; break;
+ }
+
+ OS::SNPrintF(Vector<char>(name_, len),
+ "GenericBinaryOpStub_%s_%s%s",
+ op_name,
+ overwrite_name,
+ specialized_on_rhs_ ? "_ConstantRhs" : 0);
+ return name_;
+}
void GenericBinaryOpStub::Generate(MacroAssembler* masm) {
=======================================
--- /branches/bleeding_edge/src/arm/codegen-arm.h Wed Dec 2 23:56:21 2009
+++ /branches/bleeding_edge/src/arm/codegen-arm.h Fri Dec 11 02:40:01 2009
@@ -455,13 +455,15 @@
: op_(op),
mode_(mode),
constant_rhs_(constant_rhs),
- specialized_on_rhs_(RhsIsOneWeWantToOptimizeFor(op, constant_rhs))
{ }
+ specialized_on_rhs_(RhsIsOneWeWantToOptimizeFor(op, constant_rhs)),
+ name_(NULL) { }
private:
Token::Value op_;
OverwriteMode mode_;
int constant_rhs_;
bool specialized_on_rhs_;
+ char* name_;
static const int kMaxKnownRhs = 0x40000000;
@@ -506,22 +508,7 @@
return key;
}
- const char* GetName() {
- switch (op_) {
- case Token::ADD: return "GenericBinaryOpStub_ADD";
- case Token::SUB: return "GenericBinaryOpStub_SUB";
- case Token::MUL: return "GenericBinaryOpStub_MUL";
- case Token::DIV: return "GenericBinaryOpStub_DIV";
- case Token::MOD: return "GenericBinaryOpStub_MOD";
- case Token::BIT_OR: return "GenericBinaryOpStub_BIT_OR";
- case Token::BIT_AND: return "GenericBinaryOpStub_BIT_AND";
- case Token::BIT_XOR: return "GenericBinaryOpStub_BIT_XOR";
- case Token::SAR: return "GenericBinaryOpStub_SAR";
- case Token::SHL: return "GenericBinaryOpStub_SHL";
- case Token::SHR: return "GenericBinaryOpStub_SHR";
- default: return "GenericBinaryOpStub";
- }
- }
+ const char* GetName();
#ifdef DEBUG
void Print() {
=======================================
--- /branches/bleeding_edge/src/bootstrapper.cc Tue Dec 1 06:36:45 2009
+++ /branches/bleeding_edge/src/bootstrapper.cc Fri Dec 11 02:40:01 2009
@@ -95,6 +95,8 @@
static SourceCodeCache extensions_cache(Script::TYPE_EXTENSION);
// This is for delete, not delete[].
static List<char*>* delete_these_non_arrays_on_tear_down = NULL;
+// This is for delete[]
+static List<char*>* delete_these_arrays_on_tear_down = NULL;
NativesExternalStringResource::NativesExternalStringResource(const char*
source)
@@ -148,6 +150,18 @@
natives_cache.Initialize(create_heap_objects);
extensions_cache.Initialize(create_heap_objects);
}
+
+
+char* Bootstrapper::AllocateAutoDeletedArray(int bytes) {
+ char* memory = new char[bytes];
+ if (memory != NULL) {
+ if (delete_these_arrays_on_tear_down == NULL) {
+ delete_these_arrays_on_tear_down = new List<char*>(2);
+ }
+ delete_these_arrays_on_tear_down->Add(memory);
+ }
+ return memory;
+}
void Bootstrapper::TearDown() {
@@ -156,10 +170,22 @@
ASSERT(len < 20); // Don't use this mechanism for unbounded
allocations.
for (int i = 0; i < len; i++) {
delete delete_these_non_arrays_on_tear_down->at(i);
+ delete_these_non_arrays_on_tear_down->at(i) = NULL;
}
delete delete_these_non_arrays_on_tear_down;
delete_these_non_arrays_on_tear_down = NULL;
}
+
+ if (delete_these_arrays_on_tear_down != NULL) {
+ int len = delete_these_arrays_on_tear_down->length();
+ ASSERT(len < 1000); // Don't use this mechanism for unbounded
allocations.
+ for (int i = 0; i < len; i++) {
+ delete[] delete_these_arrays_on_tear_down->at(i);
+ delete_these_arrays_on_tear_down->at(i) = NULL;
+ }
+ delete delete_these_arrays_on_tear_down;
+ delete_these_arrays_on_tear_down = NULL;
+ }
natives_cache.Initialize(false); // Yes, symmetrical
extensions_cache.Initialize(false);
=======================================
--- /branches/bleeding_edge/src/bootstrapper.h Mon Nov 9 05:30:50 2009
+++ /branches/bleeding_edge/src/bootstrapper.h Fri Dec 11 02:40:01 2009
@@ -74,6 +74,10 @@
static char* ArchiveState(char* to);
static char* RestoreState(char* from);
static void FreeThreadResources();
+
+ // This will allocate a char array that is deleted when V8 is shut down.
+ // It should only be used for strictly finite allocations.
+ static char* AllocateAutoDeletedArray(int bytes);
};
=======================================
--- /branches/bleeding_edge/src/ia32/codegen-ia32.cc Wed Dec 9 01:35:41
2009
+++ /branches/bleeding_edge/src/ia32/codegen-ia32.cc Fri Dec 11 02:40:01
2009
@@ -763,19 +763,27 @@
const char* GenericBinaryOpStub::GetName() {
- switch (op_) {
- case Token::ADD: return "GenericBinaryOpStub_ADD";
- case Token::SUB: return "GenericBinaryOpStub_SUB";
- case Token::MUL: return "GenericBinaryOpStub_MUL";
- case Token::DIV: return "GenericBinaryOpStub_DIV";
- case Token::BIT_OR: return "GenericBinaryOpStub_BIT_OR";
- case Token::BIT_AND: return "GenericBinaryOpStub_BIT_AND";
- case Token::BIT_XOR: return "GenericBinaryOpStub_BIT_XOR";
- case Token::SAR: return "GenericBinaryOpStub_SAR";
- case Token::SHL: return "GenericBinaryOpStub_SHL";
- case Token::SHR: return "GenericBinaryOpStub_SHR";
- default: return "GenericBinaryOpStub";
- }
+ if (name_ != NULL) return name_;
+ const int len = 100;
+ name_ = Bootstrapper::AllocateAutoDeletedArray(len);
+ if (name_ == NULL) return "OOM";
+ const char* op_name = Token::Name(op_);
+ const char* overwrite_name;
+ switch (mode_) {
+ case NO_OVERWRITE: overwrite_name = "Alloc"; break;
+ case OVERWRITE_RIGHT: overwrite_name = "OverwriteRight"; break;
+ case OVERWRITE_LEFT: overwrite_name = "OverwriteLeft"; break;
+ default: overwrite_name = "UnknownOverwrite"; break;
+ }
+
+ OS::SNPrintF(Vector<char>(name_, len),
+ "GenericBinaryOpStub_%s_%s%s_%s%s",
+ op_name,
+ overwrite_name,
+ (flags_ & NO_SMI_CODE_IN_STUB) ? "_NoSmiInStub" : "",
+ args_in_registers_ ? "RegArgs" : "StackArgs",
+ args_reversed_ ? "_R" : "");
+ return name_;
}
=======================================
--- /branches/bleeding_edge/src/ia32/codegen-ia32.h Wed Dec 9 01:35:41 2009
+++ /branches/bleeding_edge/src/ia32/codegen-ia32.h Fri Dec 11 02:40:01 2009
@@ -665,7 +665,8 @@
mode_(mode),
flags_(flags),
args_in_registers_(false),
- args_reversed_(false) {
+ args_reversed_(false),
+ name_(NULL) {
use_sse3_ = CpuFeatures::IsSupported(SSE3);
ASSERT(OpBits::is_valid(Token::NUM_TOKENS));
}
@@ -684,6 +685,7 @@
bool args_in_registers_; // Arguments passed in registers not on the
stack.
bool args_reversed_; // Left and right argument are swapped.
bool use_sse3_;
+ char* name_;
const char* GetName();
=======================================
--- /branches/bleeding_edge/src/token.cc Thu Nov 5 02:24:20 2009
+++ /branches/bleeding_edge/src/token.cc Fri Dec 11 02:40:01 2009
@@ -32,13 +32,11 @@
namespace v8 {
namespace internal {
-#ifdef DEBUG
#define T(name, string, precedence) #name,
const char* Token::name_[NUM_TOKENS] = {
TOKEN_LIST(T, T, IGNORE_TOKEN)
};
#undef T
-#endif
#define T(name, string, precedence) string,
=======================================
--- /branches/bleeding_edge/src/token.h Thu Nov 5 02:24:20 2009
+++ /branches/bleeding_edge/src/token.h Fri Dec 11 02:40:01 2009
@@ -211,14 +211,12 @@
};
#undef T
-#ifdef DEBUG
// Returns a string corresponding to the C++ token name
// (e.g. "LT" for the token LT).
static const char* Name(Value tok) {
ASSERT(0 <= tok && tok < NUM_TOKENS);
return name_[tok];
}
-#endif
// Predicates
static bool IsAssignmentOp(Value tok) {
@@ -261,9 +259,7 @@
}
private:
-#ifdef DEBUG
static const char* name_[NUM_TOKENS];
-#endif
static const char* string_[NUM_TOKENS];
static int8_t precedence_[NUM_TOKENS];
};
=======================================
--- /branches/bleeding_edge/src/x64/codegen-x64.cc Wed Dec 9 01:35:41 2009
+++ /branches/bleeding_edge/src/x64/codegen-x64.cc Fri Dec 11 02:40:01 2009
@@ -7372,19 +7372,28 @@
const char* GenericBinaryOpStub::GetName() {
- switch (op_) {
- case Token::ADD: return "GenericBinaryOpStub_ADD";
- case Token::SUB: return "GenericBinaryOpStub_SUB";
- case Token::MUL: return "GenericBinaryOpStub_MUL";
- case Token::DIV: return "GenericBinaryOpStub_DIV";
- case Token::BIT_OR: return "GenericBinaryOpStub_BIT_OR";
- case Token::BIT_AND: return "GenericBinaryOpStub_BIT_AND";
- case Token::BIT_XOR: return "GenericBinaryOpStub_BIT_XOR";
- case Token::SAR: return "GenericBinaryOpStub_SAR";
- case Token::SHL: return "GenericBinaryOpStub_SHL";
- case Token::SHR: return "GenericBinaryOpStub_SHR";
- default: return "GenericBinaryOpStub";
- }
+ if (name_ != NULL) return name_;
+ const int len = 100;
+ name_ = Bootstrapper::AllocateAutoDeletedArray(len);
+ if (name_ == NULL) return "OOM";
+ const char* op_name = Token::Name(op_);
+ const char* overwrite_name;
+ switch (mode_) {
+ case NO_OVERWRITE: overwrite_name = "Alloc"; break;
+ case OVERWRITE_RIGHT: overwrite_name = "OverwriteRight"; break;
+ case OVERWRITE_LEFT: overwrite_name = "OverwriteLeft"; break;
+ default: overwrite_name = "UnknownOverwrite"; break;
+ }
+
+ OS::SNPrintF(Vector<char>(name_, len),
+ "GenericBinaryOpStub_%s_%s%s_%s%s_%s",
+ op_name,
+ overwrite_name,
+ (flags_ & NO_SMI_CODE_IN_STUB) ? "_NoSmiInStub" : "",
+ args_in_registers_ ? "RegArgs" : "StackArgs",
+ args_reversed_ ? "_R" : "",
+ use_sse3_ ? "SSE3" : "SSE2");
+ return name_;
}
=======================================
--- /branches/bleeding_edge/src/x64/codegen-x64.h Wed Dec 9 01:35:41 2009
+++ /branches/bleeding_edge/src/x64/codegen-x64.h Fri Dec 11 02:40:01 2009
@@ -670,7 +670,8 @@
mode_(mode),
flags_(flags),
args_in_registers_(false),
- args_reversed_(false) {
+ args_reversed_(false),
+ name_(NULL) {
use_sse3_ = CpuFeatures::IsSupported(SSE3);
ASSERT(OpBits::is_valid(Token::NUM_TOKENS));
}
@@ -689,6 +690,7 @@
bool args_in_registers_; // Arguments passed in registers not on the
stack.
bool args_reversed_; // Left and right argument are swapped.
bool use_sse3_;
+ char* name_;
const char* GetName();
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev