| //===----------------------------------------------------------------------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "PlatformEmscripten.h" | |
| #include "lldb/Core/PluginManager.h" | |
| #include "lldb/Host/HostInfo.h" | |
| #include "lldb/Utility/LLDBLog.h" | |
| #include "lldb/Utility/Log.h" | |
| using namespace lldb; | |
| using namespace lldb_private; | |
| using namespace lldb_private::platform_emscripten; | |
| LLDB_PLUGIN_DEFINE(PlatformEmscripten) | |
| static uint32_t g_initialize_count = 0; | |
| PlatformSP PlatformEmscripten::CreateInstance(bool force, | |
| const ArchSpec *arch) { | |
| Log *log = GetLog(LLDBLog::Platform); | |
| LLDB_LOG(log, "force = {0}, arch=({1}, {2})", force, | |
| arch ? arch->GetArchitectureName() : "<null>", | |
| arch ? arch->GetTriple().getTriple() : "<null>"); | |
| bool create = | |
| force || (arch && arch->IsValid() && arch->GetTriple().isOSEmscripten()); | |
| LLDB_LOG(log, "create = {0}", create); | |
| return create ? PlatformSP(new PlatformEmscripten(false)) : PlatformSP(); | |
| } | |
| llvm::StringRef PlatformEmscripten::GetPluginDescriptionStatic(bool is_host) { | |
| if (is_host) | |
| return "Local Emscripten user platform plug-in."; | |
| return "Remote Emscripten user platform plug-in."; | |
| } | |
| void PlatformEmscripten::Initialize() { | |
| PlatformPOSIX::Initialize(); | |
| if (g_initialize_count++ == 0) { | |
| #if defined(__EMSCRIPTEN__) | |
| PlatformSP platform_sp(new PlatformEmscripten(true)); | |
| platform_sp->SetSystemArchitecture(HostInfo::GetArchitecture()); | |
| Platform::SetHostPlatform(platform_sp); | |
| #endif | |
| PluginManager::RegisterPlugin(GetPluginNameStatic(false), | |
| GetPluginDescriptionStatic(false), | |
| PlatformEmscripten::CreateInstance, nullptr); | |
| } | |
| } | |
| void PlatformEmscripten::Terminate() { | |
| if (g_initialize_count > 0 && --g_initialize_count == 0) | |
| PluginManager::UnregisterPlugin(PlatformEmscripten::CreateInstance); | |
| PlatformPOSIX::Terminate(); | |
| } | |
| PlatformEmscripten::PlatformEmscripten(bool is_host) : PlatformPOSIX(is_host) { | |
| if (is_host) | |
| m_supported_architectures.push_back(HostInfo::GetArchitecture()); | |
| else | |
| m_supported_architectures = CreateArchList( | |
| {llvm::Triple::wasm32, llvm::Triple::wasm64}, llvm::Triple::Emscripten); | |
| } | |
| std::vector<ArchSpec> PlatformEmscripten::GetSupportedArchitectures( | |
| const ArchSpec &process_host_arch) { | |
| if (m_remote_platform_sp) | |
| return m_remote_platform_sp->GetSupportedArchitectures(process_host_arch); | |
| return m_supported_architectures; | |
| } | |
| bool PlatformEmscripten::CanDebugProcess() { return false; } |