summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/ftl/FTLStackMaps.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/JavaScriptCore/ftl/FTLStackMaps.cpp')
-rw-r--r--Source/JavaScriptCore/ftl/FTLStackMaps.cpp300
1 files changed, 0 insertions, 300 deletions
diff --git a/Source/JavaScriptCore/ftl/FTLStackMaps.cpp b/Source/JavaScriptCore/ftl/FTLStackMaps.cpp
deleted file mode 100644
index a8ce12bab..000000000
--- a/Source/JavaScriptCore/ftl/FTLStackMaps.cpp
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- * Copyright (C) 2013, 2014 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. ``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
- * 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.
- */
-
-#include "config.h"
-#include "FTLStackMaps.h"
-
-#if ENABLE(FTL_JIT)
-
-#include "FTLLocation.h"
-#include <wtf/CommaPrinter.h>
-#include <wtf/DataLog.h>
-#include <wtf/ListDump.h>
-
-namespace JSC { namespace FTL {
-
-template<typename T>
-T readObject(StackMaps::ParseContext& context)
-{
- T result;
- result.parse(context);
- return result;
-}
-
-void StackMaps::Constant::parse(StackMaps::ParseContext& context)
-{
- integer = context.view->read<int64_t>(context.offset, true);
-}
-
-void StackMaps::Constant::dump(PrintStream& out) const
-{
- out.printf("0x%016llx", static_cast<unsigned long long>(integer));
-}
-
-void StackMaps::StackSize::parse(StackMaps::ParseContext& context)
-{
- switch (context.version) {
- case 0:
- functionOffset = context.view->read<uint32_t>(context.offset, true);
- size = context.view->read<uint32_t>(context.offset, true);
- break;
-
- default:
- functionOffset = context.view->read<uint64_t>(context.offset, true);
- size = context.view->read<uint64_t>(context.offset, true);
- break;
- }
-}
-
-void StackMaps::StackSize::dump(PrintStream& out) const
-{
- out.print("(off:", functionOffset, ", size:", size, ")");
-}
-
-void StackMaps::Location::parse(StackMaps::ParseContext& context)
-{
- kind = static_cast<Kind>(context.view->read<uint8_t>(context.offset, true));
- size = context.view->read<uint8_t>(context.offset, true);
- dwarfReg = DWARFRegister(context.view->read<uint16_t>(context.offset, true));
- this->offset = context.view->read<int32_t>(context.offset, true);
-}
-
-void StackMaps::Location::dump(PrintStream& out) const
-{
- out.print("(", kind, ", ", dwarfReg, ", off:", offset, ", size:", size, ")");
-}
-
-GPRReg StackMaps::Location::directGPR() const
-{
- return FTL::Location::forStackmaps(nullptr, *this).directGPR();
-}
-
-void StackMaps::Location::restoreInto(
- MacroAssembler& jit, StackMaps& stackmaps, char* savedRegisters, GPRReg result) const
-{
- FTL::Location::forStackmaps(&stackmaps, *this).restoreInto(jit, savedRegisters, result);
-}
-
-void StackMaps::LiveOut::parse(StackMaps::ParseContext& context)
-{
- dwarfReg = DWARFRegister(context.view->read<uint16_t>(context.offset, true)); // regnum
- context.view->read<uint8_t>(context.offset, true); // reserved
- size = context.view->read<uint8_t>(context.offset, true); // size in bytes
-}
-
-void StackMaps::LiveOut::dump(PrintStream& out) const
-{
- out.print("(", dwarfReg, ", ", size, ")");
-}
-
-bool StackMaps::Record::parse(StackMaps::ParseContext& context)
-{
- int64_t id = context.view->read<int64_t>(context.offset, true);
- ASSERT(static_cast<int32_t>(id) == id);
- patchpointID = static_cast<uint32_t>(id);
- if (static_cast<int32_t>(patchpointID) < 0)
- return false;
-
- instructionOffset = context.view->read<uint32_t>(context.offset, true);
- flags = context.view->read<uint16_t>(context.offset, true);
-
- unsigned length = context.view->read<uint16_t>(context.offset, true);
- while (length--)
- locations.append(readObject<Location>(context));
-
- if (context.version >= 1)
- context.view->read<uint16_t>(context.offset, true); // padding
-
- unsigned numLiveOuts = context.view->read<uint16_t>(context.offset, true);
- while (numLiveOuts--)
- liveOuts.append(readObject<LiveOut>(context));
-
- if (context.version >= 1) {
- if (context.offset & 7) {
- ASSERT(!(context.offset & 3));
- context.view->read<uint32_t>(context.offset, true); // padding
- }
- }
-
- return true;
-}
-
-void StackMaps::Record::dump(PrintStream& out) const
-{
- out.print(
- "(#", patchpointID, ", offset = ", instructionOffset, ", flags = ", flags,
- ", locations = [", listDump(locations), "], liveOuts = [",
- listDump(liveOuts), "])");
-}
-
-RegisterSet StackMaps::Record::locationSet() const
-{
- RegisterSet result;
- for (unsigned i = locations.size(); i--;) {
- Reg reg = locations[i].dwarfReg.reg();
- if (!reg)
- continue;
- result.set(reg);
- }
- return result;
-}
-
-RegisterSet StackMaps::Record::liveOutsSet() const
-{
- RegisterSet result;
- for (unsigned i = liveOuts.size(); i--;) {
- LiveOut liveOut = liveOuts[i];
- Reg reg = liveOut.dwarfReg.reg();
- // FIXME: Either assert that size is not greater than sizeof(pointer), or actually
- // save the high bits of registers.
- // https://bugs.webkit.org/show_bug.cgi?id=130885
- if (!reg) {
- dataLog("Invalid liveOuts entry in: ", *this, "\n");
- RELEASE_ASSERT_NOT_REACHED();
- }
- result.set(reg);
- }
- return result;
-}
-
-RegisterSet StackMaps::Record::usedRegisterSet() const
-{
- RegisterSet result;
- result.merge(locationSet());
- result.merge(liveOutsSet());
- return result;
-}
-
-bool StackMaps::parse(DataView* view)
-{
- ParseContext context;
- context.offset = 0;
- context.view = view;
-
- version = context.version = context.view->read<uint8_t>(context.offset, true);
-
- context.view->read<uint8_t>(context.offset, true); // Reserved
- context.view->read<uint8_t>(context.offset, true); // Reserved
- context.view->read<uint8_t>(context.offset, true); // Reserved
-
- uint32_t numFunctions;
- uint32_t numConstants;
- uint32_t numRecords;
-
- numFunctions = context.view->read<uint32_t>(context.offset, true);
- if (context.version >= 1) {
- numConstants = context.view->read<uint32_t>(context.offset, true);
- numRecords = context.view->read<uint32_t>(context.offset, true);
- }
- while (numFunctions--)
- stackSizes.append(readObject<StackSize>(context));
-
- if (!context.version)
- numConstants = context.view->read<uint32_t>(context.offset, true);
- while (numConstants--)
- constants.append(readObject<Constant>(context));
-
- if (!context.version)
- numRecords = context.view->read<uint32_t>(context.offset, true);
- while (numRecords--) {
- Record record;
- if (!record.parse(context))
- return false;
- records.append(record);
- }
-
- return true;
-}
-
-void StackMaps::dump(PrintStream& out) const
-{
- out.print("Version:", version, ", StackSizes[", listDump(stackSizes), "], Constants:[", listDump(constants), "], Records:[", listDump(records), "]");
-}
-
-void StackMaps::dumpMultiline(PrintStream& out, const char* prefix) const
-{
- out.print(prefix, "Version: ", version, "\n");
- out.print(prefix, "StackSizes:\n");
- for (unsigned i = 0; i < stackSizes.size(); ++i)
- out.print(prefix, " ", stackSizes[i], "\n");
- out.print(prefix, "Constants:\n");
- for (unsigned i = 0; i < constants.size(); ++i)
- out.print(prefix, " ", constants[i], "\n");
- out.print(prefix, "Records:\n");
- for (unsigned i = 0; i < records.size(); ++i)
- out.print(prefix, " ", records[i], "\n");
-}
-
-StackMaps::RecordMap StackMaps::computeRecordMap() const
-{
- RecordMap result;
- for (unsigned i = records.size(); i--;)
- result.add(records[i].patchpointID, Vector<Record>()).iterator->value.append(records[i]);
- return result;
-}
-
-unsigned StackMaps::stackSize() const
-{
- RELEASE_ASSERT(stackSizes.size() == 1);
-
- return stackSizes[0].size;
-}
-
-} } // namespace JSC::FTL
-
-namespace WTF {
-
-using namespace JSC::FTL;
-
-void printInternal(PrintStream& out, StackMaps::Location::Kind kind)
-{
- switch (kind) {
- case StackMaps::Location::Unprocessed:
- out.print("Unprocessed");
- return;
- case StackMaps::Location::Register:
- out.print("Register");
- return;
- case StackMaps::Location::Direct:
- out.print("Direct");
- return;
- case StackMaps::Location::Indirect:
- out.print("Indirect");
- return;
- case StackMaps::Location::Constant:
- out.print("Constant");
- return;
- case StackMaps::Location::ConstantIndex:
- out.print("ConstantIndex");
- return;
- }
- dataLog("Unrecognized kind: ", static_cast<int>(kind), "\n");
- RELEASE_ASSERT_NOT_REACHED();
-}
-
-} // namespace WTF
-
-#endif // ENABLE(FTL_JIT)
-