158947cf8SJonas Devlieghere //===-- SBReproducer.cpp ----------------------------------------*- C++ -*-===// 258947cf8SJonas Devlieghere // 3023f9998SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4023f9998SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 5023f9998SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 658947cf8SJonas Devlieghere // 758947cf8SJonas Devlieghere //===----------------------------------------------------------------------===// 858947cf8SJonas Devlieghere 958947cf8SJonas Devlieghere #include "SBReproducerPrivate.h" 1058947cf8SJonas Devlieghere 11baf5664fSJonas Devlieghere #include "SBReproducerPrivate.h" 1258947cf8SJonas Devlieghere #include "lldb/API/LLDB.h" 1358947cf8SJonas Devlieghere #include "lldb/API/SBAddress.h" 1458947cf8SJonas Devlieghere #include "lldb/API/SBAttachInfo.h" 1558947cf8SJonas Devlieghere #include "lldb/API/SBBlock.h" 1658947cf8SJonas Devlieghere #include "lldb/API/SBBreakpoint.h" 1758947cf8SJonas Devlieghere #include "lldb/API/SBCommandInterpreter.h" 1858947cf8SJonas Devlieghere #include "lldb/API/SBData.h" 1958947cf8SJonas Devlieghere #include "lldb/API/SBDebugger.h" 2058947cf8SJonas Devlieghere #include "lldb/API/SBDeclaration.h" 2158947cf8SJonas Devlieghere #include "lldb/API/SBError.h" 2258947cf8SJonas Devlieghere #include "lldb/API/SBFileSpec.h" 2358947cf8SJonas Devlieghere #include "lldb/API/SBHostOS.h" 2458947cf8SJonas Devlieghere #include "lldb/API/SBReproducer.h" 2558947cf8SJonas Devlieghere 2658947cf8SJonas Devlieghere #include "lldb/Host/FileSystem.h" 2758947cf8SJonas Devlieghere 2858947cf8SJonas Devlieghere using namespace lldb; 2958947cf8SJonas Devlieghere using namespace lldb_private; 3058947cf8SJonas Devlieghere using namespace lldb_private::repro; 3158947cf8SJonas Devlieghere 32baf5664fSJonas Devlieghere SBRegistry::SBRegistry() { 33*ae211eceSMichal Gorny Registry& R = *this; 34baf5664fSJonas Devlieghere 35*ae211eceSMichal Gorny RegisterMethods<SBAddress>(R); 36*ae211eceSMichal Gorny RegisterMethods<SBAttachInfo>(R); 37*ae211eceSMichal Gorny RegisterMethods<SBBlock>(R); 38*ae211eceSMichal Gorny RegisterMethods<SBBreakpoint>(R); 39*ae211eceSMichal Gorny RegisterMethods<SBBreakpointList>(R); 40*ae211eceSMichal Gorny RegisterMethods<SBBreakpointLocation>(R); 41*ae211eceSMichal Gorny RegisterMethods<SBBreakpointName>(R); 42*ae211eceSMichal Gorny RegisterMethods<SBBroadcaster>(R); 43*ae211eceSMichal Gorny RegisterMethods<SBCommandInterpreterRunOptions>(R); 44*ae211eceSMichal Gorny RegisterMethods<SBCommandReturnObject>(R); 45*ae211eceSMichal Gorny RegisterMethods<SBCommunication>(R); 46*ae211eceSMichal Gorny RegisterMethods<SBCompileUnit>(R); 47*ae211eceSMichal Gorny RegisterMethods<SBData>(R); 48*ae211eceSMichal Gorny RegisterMethods<SBInputReader>(R); 49*ae211eceSMichal Gorny RegisterMethods<SBDebugger>(R); 50*ae211eceSMichal Gorny RegisterMethods<SBDeclaration>(R); 51*ae211eceSMichal Gorny RegisterMethods<SBError>(R); 52*ae211eceSMichal Gorny RegisterMethods<SBEvent>(R); 53*ae211eceSMichal Gorny RegisterMethods<SBExecutionContext>(R); 54*ae211eceSMichal Gorny RegisterMethods<SBExpressionOptions>(R); 55*ae211eceSMichal Gorny RegisterMethods<SBFileSpec>(R); 56*ae211eceSMichal Gorny RegisterMethods<SBFileSpecList>(R); 57*ae211eceSMichal Gorny RegisterMethods<SBFrame>(R); 58*ae211eceSMichal Gorny RegisterMethods<SBFunction>(R); 59*ae211eceSMichal Gorny RegisterMethods<SBHostOS>(R); 60*ae211eceSMichal Gorny RegisterMethods<SBInstruction>(R); 61*ae211eceSMichal Gorny RegisterMethods<SBInstructionList>(R); 62*ae211eceSMichal Gorny RegisterMethods<SBLanguageRuntime>(R); 63*ae211eceSMichal Gorny RegisterMethods<SBLaunchInfo>(R); 64*ae211eceSMichal Gorny RegisterMethods<SBLineEntry>(R); 65*ae211eceSMichal Gorny RegisterMethods<SBListener>(R); 66*ae211eceSMichal Gorny RegisterMethods<SBMemoryRegionInfo>(R); 67*ae211eceSMichal Gorny RegisterMethods<SBMemoryRegionInfoList>(R); 68*ae211eceSMichal Gorny RegisterMethods<SBModule>(R); 69*ae211eceSMichal Gorny RegisterMethods<SBModuleSpec>(R); 70*ae211eceSMichal Gorny RegisterMethods<SBPlatformConnectOptions>(R); 71*ae211eceSMichal Gorny RegisterMethods<SBPlatformShellCommand>(R); 72*ae211eceSMichal Gorny RegisterMethods<SBPlatform>(R); 73*ae211eceSMichal Gorny RegisterMethods<SBProcess>(R); 74*ae211eceSMichal Gorny RegisterMethods<SBProcessInfo>(R); 75*ae211eceSMichal Gorny RegisterMethods<SBQueue>(R); 76*ae211eceSMichal Gorny RegisterMethods<SBQueueItem>(R); 77*ae211eceSMichal Gorny RegisterMethods<SBSection>(R); 78*ae211eceSMichal Gorny RegisterMethods<SBSourceManager>(R); 79*ae211eceSMichal Gorny RegisterMethods<SBStream>(R); 80*ae211eceSMichal Gorny RegisterMethods<SBStringList>(R); 81*ae211eceSMichal Gorny RegisterMethods<SBStructuredData>(R); 82*ae211eceSMichal Gorny RegisterMethods<SBSymbol>(R); 83*ae211eceSMichal Gorny RegisterMethods<SBSymbolContext>(R); 84*ae211eceSMichal Gorny RegisterMethods<SBSymbolContextList>(R); 85*ae211eceSMichal Gorny RegisterMethods<SBTarget>(R); 86*ae211eceSMichal Gorny RegisterMethods<SBThread>(R); 87*ae211eceSMichal Gorny RegisterMethods<SBThreadCollection>(R); 88*ae211eceSMichal Gorny RegisterMethods<SBThreadPlan>(R); 89*ae211eceSMichal Gorny RegisterMethods<SBTrace>(R); 90*ae211eceSMichal Gorny RegisterMethods<SBTraceOptions>(R); 91*ae211eceSMichal Gorny RegisterMethods<SBType>(R); 92*ae211eceSMichal Gorny RegisterMethods<SBTypeCategory>(R); 93*ae211eceSMichal Gorny RegisterMethods<SBTypeEnumMember>(R); 94*ae211eceSMichal Gorny RegisterMethods<SBTypeFilter>(R); 95*ae211eceSMichal Gorny RegisterMethods<SBTypeFormat>(R); 96*ae211eceSMichal Gorny RegisterMethods<SBTypeNameSpecifier>(R); 97*ae211eceSMichal Gorny RegisterMethods<SBTypeSummaryOptions>(R); 98*ae211eceSMichal Gorny RegisterMethods<SBTypeSummary>(R); 99*ae211eceSMichal Gorny RegisterMethods<SBTypeSynthetic>(R); 100*ae211eceSMichal Gorny RegisterMethods<SBUnixSignals>(R); 101*ae211eceSMichal Gorny RegisterMethods<SBValue>(R); 102*ae211eceSMichal Gorny RegisterMethods<SBValueList>(R); 103*ae211eceSMichal Gorny RegisterMethods<SBVariablesOptions>(R); 104*ae211eceSMichal Gorny RegisterMethods<SBWatchpoint>(R); 105baf5664fSJonas Devlieghere } 10658947cf8SJonas Devlieghere 10713ecae2fSJonas Devlieghere const char *SBReproducer::Capture() { 10813ecae2fSJonas Devlieghere static std::string error; 10913ecae2fSJonas Devlieghere if (auto e = Reproducer::Initialize(ReproducerMode::Capture, llvm::None)) { 11013ecae2fSJonas Devlieghere error = llvm::toString(std::move(e)); 11113ecae2fSJonas Devlieghere return error.c_str(); 11213ecae2fSJonas Devlieghere } 11313ecae2fSJonas Devlieghere return nullptr; 11413ecae2fSJonas Devlieghere } 11513ecae2fSJonas Devlieghere 116936c6242SJonas Devlieghere const char *SBReproducer::Capture(const char *path) { 117936c6242SJonas Devlieghere static std::string error; 118936c6242SJonas Devlieghere if (auto e = 119936c6242SJonas Devlieghere Reproducer::Initialize(ReproducerMode::Capture, FileSpec(path))) { 120936c6242SJonas Devlieghere error = llvm::toString(std::move(e)); 121936c6242SJonas Devlieghere return error.c_str(); 122936c6242SJonas Devlieghere } 123936c6242SJonas Devlieghere return nullptr; 124936c6242SJonas Devlieghere } 12558947cf8SJonas Devlieghere 126936c6242SJonas Devlieghere const char *SBReproducer::Replay(const char *path) { 127936c6242SJonas Devlieghere static std::string error; 128936c6242SJonas Devlieghere if (auto e = Reproducer::Initialize(ReproducerMode::Replay, FileSpec(path))) { 129936c6242SJonas Devlieghere error = llvm::toString(std::move(e)); 130936c6242SJonas Devlieghere return error.c_str(); 131936c6242SJonas Devlieghere } 132936c6242SJonas Devlieghere 133936c6242SJonas Devlieghere repro::Loader *loader = repro::Reproducer::Instance().GetLoader(); 134936c6242SJonas Devlieghere if (!loader) { 135936c6242SJonas Devlieghere error = "unable to get replay loader."; 136936c6242SJonas Devlieghere return error.c_str(); 137936c6242SJonas Devlieghere } 138936c6242SJonas Devlieghere 13958947cf8SJonas Devlieghere FileSpec file = loader->GetFile<SBInfo>(); 140936c6242SJonas Devlieghere if (!file) { 141936c6242SJonas Devlieghere error = "unable to get replay data from reproducer."; 142936c6242SJonas Devlieghere return error.c_str(); 143936c6242SJonas Devlieghere } 14458947cf8SJonas Devlieghere 14558947cf8SJonas Devlieghere SBRegistry registry; 14658947cf8SJonas Devlieghere registry.Replay(file); 14758947cf8SJonas Devlieghere 148936c6242SJonas Devlieghere return nullptr; 14958947cf8SJonas Devlieghere } 15058947cf8SJonas Devlieghere 15158947cf8SJonas Devlieghere char lldb_private::repro::SBProvider::ID = 0; 15258947cf8SJonas Devlieghere const char *SBInfo::name = "sbapi"; 15358947cf8SJonas Devlieghere const char *SBInfo::file = "sbapi.bin"; 154