v8/src/log.h
mads.s.ager@gmail.com 769cc962a0 Improved performance of unary addition by avoiding runtime calls.
Fixed the handling of '>' and '<=' to use right-to-left conversion and left-to-right evaluation as specified by ECMA-262.

Fixed a branch elimination bug on the ARM platform where incorrect code was generated because of overly aggressive branch elimination.

Improved performance of code that repeatedly assigns the same function to the same property of different objects with the same map.

Untangled DEBUG and ENABLE_DISASSEMBLER defines.  The disassembler no longer expects DEBUG to be defined.

Added platform-nullos.cc to serve as the basis for new platform implementations.


git-svn-id: http://v8.googlecode.com/svn/trunk@9 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
2008-08-06 10:02:49 +00:00

227 lines
7.7 KiB
C++

// Copyright 2006-2008 Google Inc. All Rights Reserved.
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following
// disclaimer in the documentation and/or other materials provided
// with the distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef V8_LOG_H_
#define V8_LOG_H_
namespace v8 { namespace internal {
// Logger is used for collecting logging information from V8 during
// execution. The result is dumped to a file.
//
// Available command line flags:
//
// --log
// Minimal logging (no API, code, or GC sample events), default is off.
//
// --log-all
// Log all events to the file, default is off. This is the same as combining
// --log-api, --log-code, and --log-gc.
//
// --log-api
// Log API events to the logfile, default is off. --log-api implies --log.
//
// --log-code
// Log code (create, move, and delete) events to the logfile, default is off.
// --log-code implies --log.
//
// --log-gc
// Log GC heap samples after each GC that can be processed by hp2ps, default
// is off. --log-gc implies --log.
//
// --logfile <filename>
// Specify the name of the logfile, default is "v8.log".
//
// --prof
// Collect statistical profiling information (ticks), default is off. The
// tick profiler requires code events, so --prof implies --log-code.
// Forward declarations.
class Ticker;
class Profiler;
class Semaphore;
class SlidingStateWindow;
#undef LOG
#ifdef ENABLE_LOGGING_AND_PROFILING
#define LOG(Call) v8::internal::Logger::Call
#else
#define LOG(Call) ((void) 0)
#endif
class VMState {
#ifdef ENABLE_LOGGING_AND_PROFILING
public:
explicit VMState(StateTag state);
~VMState();
StateTag state() { return state_; }
private:
StateTag state_;
VMState* previous_;
#else
public:
explicit VMState(StateTag state) {}
#endif
};
class Logger {
public:
// Opens the file for logging if the right flags are set.
static bool Setup();
// Closes file opened in Setup.
static void TearDown();
// Enable the computation of a sliding window of states.
static void EnableSlidingStateWindow();
// Write a raw string to the log to be used as a preamble.
// No check is made that the 'preamble' is actually at the beginning
// of the log.
static void Preamble(const char* content);
// ==== Events that are always logged. ====
// Emits an event with a string value -> (name, value).
static void StringEvent(const char* name, const char* value);
// Emits an event with an int value -> (name, value).
static void IntEvent(const char* name, int value);
// Emits an event with an handle value -> (name, location).
static void HandleEvent(const char* name, Object** location);
// Emits memory management events for C allocated structures.
static void NewEvent(const char* name, void* object, size_t size);
static void DeleteEvent(const char* name, void* object);
// Emits an event with a tag, and some resource usage information.
// -> (name, tag, <rusage information>).
// Currently, the resource usage information is a process time stamp
// and a real time timestamp.
static void ResourceEvent(const char* name, const char* tag);
// Emits an event that an undefined property was read from an
// object.
static void SuspectReadEvent(String* name, String* obj);
// Emits an event when a message is put on or read from a debugging queue.
// DebugTag lets us put a call-site specific label on the event.
static void DebugTag(const char* call_site_tag);
static void DebugEvent(const char* event_type, Vector<uint16_t> parameter);
// ==== Events logged by --log-api. ====
static void ApiNamedSecurityCheck(Object* key);
static void ApiIndexedSecurityCheck(uint32_t index);
static void ApiNamedPropertyAccess(const char* tag,
JSObject* holder,
Object* name);
static void ApiIndexedPropertyAccess(const char* tag,
JSObject* holder,
uint32_t index);
static void ApiObjectAccess(const char* tag, JSObject* obj);
static void ApiEntryCall(const char* name);
// ==== Events logged by --log-code. ====
// Emits a code create event.
static void CodeCreateEvent(const char* tag, Code* code, const char* source);
static void CodeCreateEvent(const char* tag, Code* code, String* name);
static void CodeCreateEvent(const char* tag, Code* code, int args_count);
// Emits a code move event.
static void CodeMoveEvent(Address from, Address to);
// Emits a code delete event.
static void CodeDeleteEvent(Address from);
// ==== Events logged by --log-gc. ====
// Heap sampling events: start, end, and individual types.
static void HeapSampleBeginEvent(const char* space, const char* kind);
static void HeapSampleEndEvent(const char* space, const char* kind);
static void HeapSampleItemEvent(const char* type, int number, int bytes);
static void SharedLibraryEvent(const char* library_path,
unsigned start,
unsigned end);
static void SharedLibraryEvent(const wchar_t* library_path,
unsigned start,
unsigned end);
#ifdef ENABLE_LOGGING_AND_PROFILING
static StateTag state() {
return current_state_ ? current_state_->state() : OTHER;
}
#endif
#ifdef ENABLE_LOGGING_AND_PROFILING
private:
// Emits a profiler tick event. Used by the profiler thread.
static void TickEvent(TickSample* sample, bool overflow);
static void ApiEvent(const char* name, ...);
// When logging is active, logfile_ refers the file
// events are written to.
static FILE* logfile_;
// The sampler used by the profiler and the sliding state window.
static Ticker* ticker_;
// When the statistical profile is active, profiler_
// points to a Profiler, that handles collection
// of samples.
static Profiler* profiler_;
// mutex_ is a Mutex used for enforcing exclusive
// access to the log file.
static Mutex* mutex_;
// A stack of VM states.
static VMState* current_state_;
// SlidingStateWindow instance keeping a sliding window of the most
// recent VM states.
static SlidingStateWindow* sliding_state_window_;
// Internal implementation classes with access to
// private members.
friend class EventLog;
friend class TimeLog;
friend class Profiler;
friend class SlidingStateWindow;
friend class VMState;
#endif
};
} } // namespace v8::internal
#endif // V8_LOG_H_