blob: e323ec5b499b1f2bb9014a43721a0c1702665e20 [file] [log] [blame]
/*
* Copyright (C) 2011 Apple 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:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. 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.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS 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 APPLE INC. OR ITS 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.
*/
#pragma once
#include "SamplingCounter.h"
#include <wtf/Assertions.h>
namespace JSC {
// This allows the JIT to distinguish between uses of the barrier for different
// kinds of writes. This is used by the JIT for profiling, and may be appropriate
// for allowing the GC implementation to specialize the JIT's write barrier code
// for different kinds of target objects.
enum WriteBarrierUseKind {
// This allows specialization for access to the property storage (either
// array element or property), but not for any other kind of property
// accesses (such as writes that are a consequence of setter execution).
WriteBarrierForPropertyAccess,
// This allows specialization for variable accesses (such as global or
// scoped variables).
WriteBarrierForVariableAccess,
// This captures all other forms of write barriers. It should always be
// correct to use a generic access write barrier, even when storing to
// properties. Hence, if optimization is not necessary, it is preferable
// to just use a generic access.
WriteBarrierForGenericAccess
};
class WriteBarrierCounters {
private:
WriteBarrierCounters() { }
public:
#if ENABLE(WRITE_BARRIER_PROFILING)
static GlobalSamplingCounter usesWithBarrierFromCpp;
static GlobalSamplingCounter usesWithoutBarrierFromCpp;
static GlobalSamplingCounter usesWithBarrierFromJit;
static GlobalSamplingCounter usesForPropertiesFromJit;
static GlobalSamplingCounter usesForVariablesFromJit;
static GlobalSamplingCounter usesWithoutBarrierFromJit;
static void initialize();
static GlobalSamplingCounter& jitCounterFor(WriteBarrierUseKind useKind)
{
switch (useKind) {
case WriteBarrierForPropertyAccess:
return usesForPropertiesFromJit;
case WriteBarrierForVariableAccess:
return usesForVariablesFromJit;
default:
ASSERT(useKind == WriteBarrierForGenericAccess);
return usesWithBarrierFromJit;
}
}
#else
// These are necessary to work around not having conditional exports.
JS_EXPORT_PRIVATE static char usesWithBarrierFromCpp;
JS_EXPORT_PRIVATE static char usesWithoutBarrierFromCpp;
#endif // ENABLE(WRITE_BARRIER_PROFILING)
static void countWriteBarrier()
{
#if ENABLE(WRITE_BARRIER_PROFILING)
WriteBarrierCounters::usesWithBarrierFromCpp.count();
#endif
}
};
} // namespace JSC