#pragma once
#if ENABLE(FTL_JIT)
#include "B3OpaqueByproducts.h"
#include "DFGCommonData.h"
#include "FTLLazySlowPath.h"
#include "FTLOSRExit.h"
#include "JITCode.h"
namespace JSC {
class TrackedReferences;
namespace FTL {
class JITCode : public JSC::JITCode {
public:
JITCode();
~JITCode();
CodePtr<JSEntryPtrTag> addressForCall(ArityCheckMode) override;
void* executableAddressAtOffset(size_t offset) override;
void* dataAddressAtOffset(size_t offset) override;
unsigned offsetOf(void* pointerIntoCode) override;
size_t size() override;
bool contains(void*) override;
void initializeB3Code(CodeRef<JSEntryPtrTag>);
void initializeB3Byproducts(std::unique_ptr<B3::OpaqueByproducts>);
void initializeAddressForCall(CodePtr<JSEntryPtrTag>);
void initializeArityCheckEntrypoint(CodeRef<JSEntryPtrTag>);
void validateReferences(const TrackedReferences&) override;
RegisterSet liveRegistersToPreserveAtExceptionHandlingCallSite(CodeBlock*, CallSiteIndex) override;
Optional<CodeOrigin> findPC(CodeBlock*, void* pc) override;
CodeRef<JSEntryPtrTag> b3Code() const { return m_b3Code; }
JITCode* ftl() override;
DFG::CommonData* dfgCommon() override;
static ptrdiff_t commonDataOffset() { return OBJECT_OFFSETOF(JITCode, common); }
DFG::CommonData common;
SegmentedVector<OSRExit, 8> osrExit;
SegmentedVector<OSRExitDescriptor, 8> osrExitDescriptors;
Vector<std::unique_ptr<LazySlowPath>> lazySlowPaths;
private:
CodePtr<JSEntryPtrTag> m_addressForCall;
CodeRef<JSEntryPtrTag> m_b3Code;
std::unique_ptr<B3::OpaqueByproducts> m_b3Byproducts;
CodeRef<JSEntryPtrTag> m_arityCheckEntrypoint;
};
} }
#endif // ENABLE(FTL_JIT)