diff options
Diffstat (limited to 'lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptExpressionOpts.cpp')
-rw-r--r-- | lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptExpressionOpts.cpp | 276 |
1 files changed, 137 insertions, 139 deletions
diff --git a/lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptExpressionOpts.cpp b/lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptExpressionOpts.cpp index 67850dbbda5..2471f6a71e7 100644 --- a/lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptExpressionOpts.cpp +++ b/lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptExpressionOpts.cpp @@ -37,165 +37,163 @@ 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 +// 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. - -namespace -{ -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 - 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; +// 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. + +namespace { +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 + 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; } } // end anonymous namespace -bool -RenderScriptRuntimeModulePass::runOnModule(llvm::Module &module) -{ - bool changed_module = false; - Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_LANGUAGE | LIBLLDB_LOG_EXPRESSIONS)); - - std::string err; - llvm::StringRef real_triple = m_process_ptr->GetTarget().GetArchitecture().GetTriple().getTriple(); - const llvm::Target *target_info = llvm::TargetRegistry::lookupTarget(real_triple, err); - if (!target_info) - { - if (log) - log->Warning("couldn't determine real target architecture: '%s'", err.c_str()); - return false; - } - - llvm::Optional<llvm::Reloc::Model> reloc_model = llvm::None; - 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; +bool RenderScriptRuntimeModulePass::runOnModule(llvm::Module &module) { + bool changed_module = false; + Log *log( + GetLogIfAllCategoriesSet(LIBLLDB_LOG_LANGUAGE | LIBLLDB_LOG_EXPRESSIONS)); + + std::string err; + llvm::StringRef real_triple = + m_process_ptr->GetTarget().GetArchitecture().GetTriple().getTriple(); + const llvm::Target *target_info = + llvm::TargetRegistry::lookupTarget(real_triple, err); + if (!target_info) { + if (log) + log->Warning("couldn't determine real target architecture: '%s'", + err.c_str()); + return false; + } + + llvm::Optional<llvm::Reloc::Model> reloc_model = llvm::None; + 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) { + log->Printf("%s - Changing RS target triple to '%s'", __FUNCTION__, + real_triple.str().c_str()); + log->Printf( + "%s - Changing RS datalayout to '%s'", __FUNCTION__, + target_machine->createDataLayout().getStringRepresentation().c_str()); } - - 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) - { - log->Printf("%s - Changing RS target triple to '%s'", __FUNCTION__, real_triple.str().c_str()); - log->Printf("%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; + module.setTargetTriple(real_triple); + module.setDataLayout(target_machine->createDataLayout()); + } + return changed_module; } char RenderScriptRuntimeModulePass::ID = 0; -namespace lldb_private -{ +namespace lldb_private { -bool -RenderScriptRuntime::GetOverrideExprOptions(clang::TargetOptions &proto) -{ - auto *process = GetProcess(); - assert(process); - return registerRSDefaultTargetOpts(proto, process->GetTarget().GetArchitecture().GetMachine()); +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); +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; + passes.EarlyPasses = m_ir_passes->EarlyPasses; + passes.LatePasses = m_ir_passes->LatePasses; - return true; + return true; } -namespace lldb_renderscript -{ +namespace lldb_renderscript { -RSIRPasses::RSIRPasses(Process *process) -{ - IRPasses(); - assert(process); +RSIRPasses::RSIRPasses(Process *process) { + IRPasses(); + assert(process); - EarlyPasses = std::make_shared<llvm::legacy::PassManager>(); - assert(EarlyPasses); - EarlyPasses->add(new RenderScriptRuntimeModulePass(process)); + EarlyPasses = std::make_shared<llvm::legacy::PassManager>(); + assert(EarlyPasses); + EarlyPasses->add(new RenderScriptRuntimeModulePass(process)); } -RSIRPasses::~RSIRPasses() -{ -} +RSIRPasses::~RSIRPasses() {} } // namespace lldb_renderscript } // namespace lldb_private |