Give the binary op stubs better names to make profiles more informative.
Review URL: http://codereview.chromium.org/488017 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3454 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
cfb6b2ded8
commit
a4ad7b8bf3
@ -5680,6 +5680,29 @@ static void MultiplyByKnownInt2(
|
||||
}
|
||||
|
||||
|
||||
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) {
|
||||
// r1 : x
|
||||
// r0 : y
|
||||
|
@ -455,13 +455,15 @@ class GenericBinaryOpStub : public CodeStub {
|
||||
: 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 @@ class GenericBinaryOpStub : public CodeStub {
|
||||
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() {
|
||||
|
@ -95,6 +95,8 @@ static SourceCodeCache natives_cache(Script::TYPE_NATIVE);
|
||||
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)
|
||||
@ -150,17 +152,41 @@ void Bootstrapper::Initialize(bool 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() {
|
||||
if (delete_these_non_arrays_on_tear_down != NULL) {
|
||||
int len = delete_these_non_arrays_on_tear_down->length();
|
||||
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);
|
||||
}
|
||||
|
@ -74,6 +74,10 @@ class Bootstrapper : public AllStatic {
|
||||
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);
|
||||
};
|
||||
|
||||
|
||||
|
@ -763,19 +763,27 @@ class FloatingPointHelper : public AllStatic {
|
||||
|
||||
|
||||
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_;
|
||||
}
|
||||
|
||||
|
||||
|
@ -665,7 +665,8 @@ class GenericBinaryOpStub: public CodeStub {
|
||||
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 @@ class GenericBinaryOpStub: public CodeStub {
|
||||
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();
|
||||
|
||||
|
@ -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,
|
||||
|
@ -211,14 +211,12 @@ class Token {
|
||||
};
|
||||
#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 @@ class Token {
|
||||
}
|
||||
|
||||
private:
|
||||
#ifdef DEBUG
|
||||
static const char* name_[NUM_TOKENS];
|
||||
#endif
|
||||
static const char* string_[NUM_TOKENS];
|
||||
static int8_t precedence_[NUM_TOKENS];
|
||||
};
|
||||
|
@ -7372,19 +7372,28 @@ void FloatingPointHelper::CheckNumberOperands(MacroAssembler* masm,
|
||||
|
||||
|
||||
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_;
|
||||
}
|
||||
|
||||
|
||||
|
@ -670,7 +670,8 @@ class GenericBinaryOpStub: public CodeStub {
|
||||
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 @@ class GenericBinaryOpStub: public CodeStub {
|
||||
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();
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user