mirror of
https://github.com/darlinghq/darling-JavaScriptCore.git
synced 2025-04-07 09:21:41 +00:00
96 lines
3.7 KiB
C++
96 lines
3.7 KiB
C++
/*
|
|
* 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
|