11 #include "llvm/ADT/StringRef.h"
12 #include "llvm/IR/Instruction.h"
13 #include "llvm/IR/Instructions.h"
14 #include "llvm/IR/LegacyPassManager.h"
15 #include "llvm/IR/Module.h"
16 #include "llvm/MC/TargetRegistry.h"
17 #include "llvm/Target/TargetMachine.h"
18 #include "llvm/Target/TargetOptions.h"
20 #include "clang/Basic/TargetOptions.h"
32 using namespace lldb_renderscript;
44 const llvm::Triple::ArchType &arch) {
46 case llvm::Triple::ArchType::x86:
47 proto.Triple =
"i686--linux-android";
49 proto.Features.push_back(
"+long64");
52 case llvm::Triple::ArchType::x86_64:
53 proto.Features.push_back(
"+mmx");
54 proto.Features.push_back(
"+sse");
55 proto.Features.push_back(
"+sse2");
56 proto.Features.push_back(
"+sse3");
57 proto.Features.push_back(
"+ssse3");
58 proto.Features.push_back(
"+sse4.1");
59 proto.Features.push_back(
"+sse4.2");
61 case llvm::Triple::ArchType::mipsel:
63 proto.Triple =
"armv7-none-linux-android";
65 proto.Features.push_back(
"+long64");
67 case llvm::Triple::ArchType::mips64el:
69 proto.Triple =
"aarch64-none-linux-android";
79 bool changed_module =
false;
83 llvm::StringRef real_triple =
84 m_process_ptr->GetTarget().GetArchitecture().GetTriple().getTriple();
85 const llvm::Target *target_info =
86 llvm::TargetRegistry::lookupTarget(
std::string(real_triple), err);
89 log->
Warning(
"couldn't determine real target architecture: '%s'",
94 std::optional<llvm::Reloc::Model> reloc_model;
95 assert(m_process_ptr &&
"no available lldb process");
96 switch (m_process_ptr->GetTarget().GetArchitecture().GetMachine()) {
97 case llvm::Triple::ArchType::x86:
103 real_triple =
"i686--linux-android";
105 case llvm::Triple::ArchType::x86_64:
108 case llvm::Triple::ArchType::mipsel:
109 case llvm::Triple::ArchType::mips64el:
116 reloc_model = llvm::Reloc::Static;
117 changed_module =
true;
119 case llvm::Triple::ArchType::arm:
120 case llvm::Triple::ArchType::aarch64:
127 log->
Warning(
"Ignoring unknown renderscript target");
131 if (changed_module) {
132 llvm::TargetOptions options;
133 llvm::TargetMachine *target_machine = target_info->createTargetMachine(
134 real_triple,
"",
"", options, reloc_model);
135 assert(target_machine &&
136 "failed to identify RenderScriptRuntime target machine");
140 LLDB_LOGF(log,
"%s - Changing RS target triple to '%s'", __FUNCTION__,
141 real_triple.str().c_str());
143 log,
"%s - Changing RS datalayout to '%s'", __FUNCTION__,
144 target_machine->createDataLayout().getStringRepresentation().c_str());
146 module.setTargetTriple(real_triple);
147 module.setDataLayout(target_machine->createDataLayout());
149 return changed_module;
157 auto *process = GetProcess();
160 proto, process->GetTarget().GetArchitecture().GetMachine());
174 namespace lldb_renderscript {
179 EarlyPasses = std::make_shared<llvm::legacy::PassManager>();