// Copyright 2013 the V8 project authors. All rights reserved.
|
// Use of this source code is governed by a BSD-style license that can be
|
// found in the LICENSE file.
|
|
#ifndef V8_COMPILER_GRAPH_VISUALIZER_H_
|
#define V8_COMPILER_GRAPH_VISUALIZER_H_
|
|
#include <stdio.h>
|
#include <fstream> // NOLINT(readability/streams)
|
#include <iosfwd>
|
#include <memory>
|
|
#include "src/globals.h"
|
#include "src/handles.h"
|
|
namespace v8 {
|
namespace internal {
|
|
class OptimizedCompilationInfo;
|
class SharedFunctionInfo;
|
class SourcePosition;
|
namespace compiler {
|
|
class Graph;
|
class InstructionSequence;
|
class NodeOrigin;
|
class NodeOriginTable;
|
class RegisterAllocationData;
|
class Schedule;
|
class SourcePositionTable;
|
|
struct TurboJsonFile : public std::ofstream {
|
TurboJsonFile(OptimizedCompilationInfo* info, std::ios_base::openmode mode);
|
~TurboJsonFile();
|
};
|
|
struct SourcePositionAsJSON {
|
explicit SourcePositionAsJSON(const SourcePosition& sp) : sp(sp) {}
|
const SourcePosition& sp;
|
};
|
|
V8_INLINE V8_EXPORT_PRIVATE SourcePositionAsJSON
|
AsJSON(const SourcePosition& sp) {
|
return SourcePositionAsJSON(sp);
|
}
|
|
struct NodeOriginAsJSON {
|
explicit NodeOriginAsJSON(const NodeOrigin& no) : no(no) {}
|
const NodeOrigin& no;
|
};
|
|
V8_INLINE V8_EXPORT_PRIVATE NodeOriginAsJSON AsJSON(const NodeOrigin& no) {
|
return NodeOriginAsJSON(no);
|
}
|
|
std::ostream& operator<<(std::ostream& out, const SourcePositionAsJSON& pos);
|
|
// Small helper that deduplicates SharedFunctionInfos.
|
class SourceIdAssigner {
|
public:
|
explicit SourceIdAssigner(size_t size) {
|
printed_.reserve(size);
|
source_ids_.reserve(size);
|
}
|
int GetIdFor(Handle<SharedFunctionInfo> shared);
|
int GetIdAt(size_t pos) const { return source_ids_[pos]; }
|
|
private:
|
std::vector<Handle<SharedFunctionInfo>> printed_;
|
std::vector<int> source_ids_;
|
};
|
|
void JsonPrintAllSourceWithPositions(std::ostream& os,
|
OptimizedCompilationInfo* info,
|
Isolate* isolate);
|
|
void JsonPrintFunctionSource(std::ostream& os, int source_id,
|
std::unique_ptr<char[]> function_name,
|
Handle<Script> script, Isolate* isolate,
|
Handle<SharedFunctionInfo> shared,
|
bool with_key = false);
|
std::unique_ptr<char[]> GetVisualizerLogFileName(OptimizedCompilationInfo* info,
|
const char* optional_base_dir,
|
const char* phase,
|
const char* suffix);
|
|
struct GraphAsJSON {
|
GraphAsJSON(const Graph& g, SourcePositionTable* p, NodeOriginTable* o)
|
: graph(g), positions(p), origins(o) {}
|
const Graph& graph;
|
const SourcePositionTable* positions;
|
const NodeOriginTable* origins;
|
};
|
|
V8_INLINE V8_EXPORT_PRIVATE GraphAsJSON AsJSON(const Graph& g,
|
SourcePositionTable* p,
|
NodeOriginTable* o) {
|
return GraphAsJSON(g, p, o);
|
}
|
|
V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os,
|
const GraphAsJSON& ad);
|
|
struct AsRPO {
|
explicit AsRPO(const Graph& g) : graph(g) {}
|
const Graph& graph;
|
};
|
|
V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os, const AsRPO& ad);
|
|
struct AsC1VCompilation {
|
explicit AsC1VCompilation(const OptimizedCompilationInfo* info)
|
: info_(info) {}
|
const OptimizedCompilationInfo* info_;
|
};
|
|
struct AsScheduledGraph {
|
explicit AsScheduledGraph(const Schedule* schedule) : schedule(schedule) {}
|
const Schedule* schedule;
|
};
|
|
std::ostream& operator<<(std::ostream& os, const AsScheduledGraph& scheduled);
|
struct AsC1V {
|
AsC1V(const char* phase, const Schedule* schedule,
|
const SourcePositionTable* positions = nullptr,
|
const InstructionSequence* instructions = nullptr)
|
: schedule_(schedule),
|
instructions_(instructions),
|
positions_(positions),
|
phase_(phase) {}
|
const Schedule* schedule_;
|
const InstructionSequence* instructions_;
|
const SourcePositionTable* positions_;
|
const char* phase_;
|
};
|
|
struct AsC1VRegisterAllocationData {
|
explicit AsC1VRegisterAllocationData(
|
const char* phase, const RegisterAllocationData* data = nullptr)
|
: phase_(phase), data_(data) {}
|
const char* phase_;
|
const RegisterAllocationData* data_;
|
};
|
|
std::ostream& operator<<(std::ostream& os, const AsC1VCompilation& ac);
|
std::ostream& operator<<(std::ostream& os, const AsC1V& ac);
|
std::ostream& operator<<(std::ostream& os,
|
const AsC1VRegisterAllocationData& ac);
|
|
} // namespace compiler
|
} // namespace internal
|
} // namespace v8
|
|
#endif // V8_COMPILER_GRAPH_VISUALIZER_H_
|