diff options
Diffstat (limited to 'contrib/llvm-project/lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptExpressionOpts.cpp')
-rw-r--r-- | contrib/llvm-project/lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptExpressionOpts.cpp | 187 |
1 files changed, 0 insertions, 187 deletions
diff --git a/contrib/llvm-project/lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptExpressionOpts.cpp b/contrib/llvm-project/lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptExpressionOpts.cpp deleted file mode 100644 index 2430ec3ff5d4..000000000000 --- a/contrib/llvm-project/lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptExpressionOpts.cpp +++ /dev/null @@ -1,187 +0,0 @@ -//===-- RenderScriptExpressionOpts.cpp ------------------------------------===// -// -// 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 <string> - -#include "llvm/ADT/StringRef.h" -#include "llvm/IR/Instruction.h" -#include "llvm/IR/Instructions.h" -#include "llvm/IR/LegacyPassManager.h" -#include "llvm/IR/Module.h" -#include "llvm/MC/TargetRegistry.h" -#include "llvm/Target/TargetMachine.h" -#include "llvm/Target/TargetOptions.h" - -#include "clang/Basic/TargetOptions.h" - -#include "lldb/Target/Process.h" -#include "lldb/Target/Target.h" -#include "lldb/Utility/LLDBLog.h" -#include "lldb/Utility/Log.h" - -#include "RenderScriptExpressionOpts.h" -#include "RenderScriptRuntime.h" -#include "RenderScriptx86ABIFixups.h" - -using namespace lldb_private; -using namespace lldb_renderscript; - -// [``slang``](https://android.googlesource.com/platform/frameworks/compile/slang), -// the compiler frontend for RenderScript embeds an ARM specific triple in IR -// that is shipped in the app, after generating IR that has some assumptions -// that an ARM device is the target. As the IR is then compiled on a device of -// unknown (at time the IR was generated at least) architecture, when calling -// RenderScript API function as part of debugger expressions, we have to -// perform a fixup pass that removes those assumptions right before the module -// is sent to be generated by the llvm backend. - -static bool registerRSDefaultTargetOpts(clang::TargetOptions &proto, - const llvm::Triple::ArchType &arch) { - switch (arch) { - case llvm::Triple::ArchType::x86: - proto.Triple = "i686--linux-android"; - proto.CPU = "atom"; - proto.Features.push_back("+long64"); - // Fallthrough for common x86 family features - [[fallthrough]]; - case llvm::Triple::ArchType::x86_64: - proto.Features.push_back("+mmx"); - proto.Features.push_back("+sse"); - proto.Features.push_back("+sse2"); - proto.Features.push_back("+sse3"); - proto.Features.push_back("+ssse3"); - proto.Features.push_back("+sse4.1"); - proto.Features.push_back("+sse4.2"); - break; - case llvm::Triple::ArchType::mipsel: - // pretend this is `arm' for the front-end - proto.Triple = "armv7-none-linux-android"; - proto.CPU = ""; - proto.Features.push_back("+long64"); - break; - case llvm::Triple::ArchType::mips64el: - // pretend this is `aarch64' for the front-end - proto.Triple = "aarch64-none-linux-android"; - proto.CPU = ""; - break; - default: - return false; - } - return true; -} - -bool RenderScriptRuntimeModulePass::runOnModule(llvm::Module &module) { - bool changed_module = false; - Log *log = GetLog(LLDBLog::Language | LLDBLog::Expressions); - - std::string err; - llvm::StringRef real_triple = - m_process_ptr->GetTarget().GetArchitecture().GetTriple().getTriple(); - const llvm::Target *target_info = - llvm::TargetRegistry::lookupTarget(std::string(real_triple), err); - if (!target_info) { - if (log) - log->Warning("couldn't determine real target architecture: '%s'", - err.c_str()); - return false; - } - - std::optional<llvm::Reloc::Model> reloc_model; - assert(m_process_ptr && "no available lldb process"); - switch (m_process_ptr->GetTarget().GetArchitecture().GetMachine()) { - case llvm::Triple::ArchType::x86: - changed_module |= fixupX86FunctionCalls(module); - // For some reason this triple gets totally missed by the backend, and must - // be set manually. There a reference in bcc/Main.cpp about auto feature- - // detection being removed from LLVM3.5, but I can't see that discussion - // anywhere public. - real_triple = "i686--linux-android"; - break; - case llvm::Triple::ArchType::x86_64: - changed_module |= fixupX86_64FunctionCalls(module); - break; - case llvm::Triple::ArchType::mipsel: - case llvm::Triple::ArchType::mips64el: - // No actual IR fixup pass is needed on MIPS, but the datalayout and - // targetmachine do need to be explicitly set. - - // bcc explicitly compiles MIPS code to use the static relocation model due - // to an issue with relocations in mclinker. see - // libbcc/support/CompilerConfig.cpp for details - reloc_model = llvm::Reloc::Static; - changed_module = true; - break; - case llvm::Triple::ArchType::arm: - case llvm::Triple::ArchType::aarch64: - // ARM subtargets need no fixup passes as they are the initial target as - // generated by the - // slang compiler frontend. - break; - default: - if (log) - log->Warning("Ignoring unknown renderscript target"); - return false; - } - - if (changed_module) { - llvm::TargetOptions options; - llvm::TargetMachine *target_machine = target_info->createTargetMachine( - real_triple, "", "", options, reloc_model); - assert(target_machine && - "failed to identify RenderScriptRuntime target machine"); - // We've been using a triple and datalayout of some ARM variant all along, - // so we need to let the backend know that this is no longer the case. - if (log) { - LLDB_LOGF(log, "%s - Changing RS target triple to '%s'", __FUNCTION__, - real_triple.str().c_str()); - LLDB_LOGF( - log, "%s - Changing RS datalayout to '%s'", __FUNCTION__, - target_machine->createDataLayout().getStringRepresentation().c_str()); - } - module.setTargetTriple(real_triple); - module.setDataLayout(target_machine->createDataLayout()); - } - return changed_module; -} - -char RenderScriptRuntimeModulePass::ID = 0; - -namespace lldb_private { - -bool RenderScriptRuntime::GetOverrideExprOptions(clang::TargetOptions &proto) { - auto *process = GetProcess(); - assert(process); - return registerRSDefaultTargetOpts( - proto, process->GetTarget().GetArchitecture().GetMachine()); -} - -bool RenderScriptRuntime::GetIRPasses(LLVMUserExpression::IRPasses &passes) { - if (!m_ir_passes) - m_ir_passes = new RSIRPasses(GetProcess()); - assert(m_ir_passes); - - passes.EarlyPasses = m_ir_passes->EarlyPasses; - passes.LatePasses = m_ir_passes->LatePasses; - - return true; -} - -namespace lldb_renderscript { - -RSIRPasses::RSIRPasses(Process *process) { - assert(process); - - EarlyPasses = std::make_shared<llvm::legacy::PassManager>(); - assert(EarlyPasses); - EarlyPasses->add(new RenderScriptRuntimeModulePass(process)); -} - -RSIRPasses::~RSIRPasses() = default; - -} // namespace lldb_renderscript -} // namespace lldb_private |