xref: /llvm-project/lldb/source/Host/android/HostInfoAndroid.cpp (revision b9c1b51e45b845debb76d8658edabca70ca56079)
100e305d2STamas Berghammer //===-- HostInfoAndroid.cpp -------------------------------------*- C++ -*-===//
200e305d2STamas Berghammer //
300e305d2STamas Berghammer //                     The LLVM Compiler Infrastructure
400e305d2STamas Berghammer //
500e305d2STamas Berghammer // This file is distributed under the University of Illinois Open Source
600e305d2STamas Berghammer // License. See LICENSE.TXT for details.
700e305d2STamas Berghammer //
800e305d2STamas Berghammer //===----------------------------------------------------------------------===//
900e305d2STamas Berghammer 
1000e305d2STamas Berghammer #include "lldb/Host/android/HostInfoAndroid.h"
1100e305d2STamas Berghammer #include "lldb/Host/linux/HostInfoLinux.h"
12dad4db71STamas Berghammer #include "llvm/ADT/SmallVector.h"
13dad4db71STamas Berghammer #include "llvm/ADT/StringRef.h"
1400e305d2STamas Berghammer 
1500e305d2STamas Berghammer using namespace lldb_private;
16dad4db71STamas Berghammer using namespace llvm;
1700e305d2STamas Berghammer 
18*b9c1b51eSKate Stone void HostInfoAndroid::ComputeHostArchitectureSupport(ArchSpec &arch_32,
19*b9c1b51eSKate Stone                                                      ArchSpec &arch_64) {
2000e305d2STamas Berghammer   HostInfoLinux::ComputeHostArchitectureSupport(arch_32, arch_64);
2100e305d2STamas Berghammer 
22*b9c1b51eSKate Stone   if (arch_32.IsValid()) {
2300e305d2STamas Berghammer     arch_32.GetTriple().setEnvironment(llvm::Triple::Android);
2400e305d2STamas Berghammer   }
25*b9c1b51eSKate Stone   if (arch_64.IsValid()) {
2600e305d2STamas Berghammer     arch_64.GetTriple().setEnvironment(llvm::Triple::Android);
2700e305d2STamas Berghammer   }
2800e305d2STamas Berghammer }
29fb9015ddSOleksiy Vyalov 
30*b9c1b51eSKate Stone FileSpec HostInfoAndroid::GetDefaultShell() {
31bd05108eSTamas Berghammer   return FileSpec("/system/bin/sh", false);
32bd05108eSTamas Berghammer }
33dad4db71STamas Berghammer 
34*b9c1b51eSKate Stone FileSpec HostInfoAndroid::ResolveLibraryPath(const std::string &module_path,
35*b9c1b51eSKate Stone                                              const ArchSpec &arch) {
36dad4db71STamas Berghammer   static const char *const ld_library_path_separator = ":";
37*b9c1b51eSKate Stone   static const char *const default_lib32_path[] = {"/vendor/lib", "/system/lib",
38*b9c1b51eSKate Stone                                                    nullptr};
39*b9c1b51eSKate Stone   static const char *const default_lib64_path[] = {"/vendor/lib64",
40*b9c1b51eSKate Stone                                                    "/system/lib64", nullptr};
41dad4db71STamas Berghammer 
42dad4db71STamas Berghammer   if (module_path.empty() || module_path[0] == '/')
43dad4db71STamas Berghammer     return FileSpec(module_path.c_str(), true);
44dad4db71STamas Berghammer 
45dad4db71STamas Berghammer   SmallVector<StringRef, 4> ld_paths;
46dad4db71STamas Berghammer 
47dad4db71STamas Berghammer   if (const char *ld_library_path = ::getenv("LD_LIBRARY_PATH"))
48*b9c1b51eSKate Stone     StringRef(ld_library_path)
49*b9c1b51eSKate Stone         .split(ld_paths, StringRef(ld_library_path_separator), -1, false);
50dad4db71STamas Berghammer 
51dad4db71STamas Berghammer   const char *const *default_lib_path = nullptr;
52*b9c1b51eSKate Stone   switch (arch.GetAddressByteSize()) {
53dad4db71STamas Berghammer   case 4:
54dad4db71STamas Berghammer     default_lib_path = default_lib32_path;
55dad4db71STamas Berghammer     break;
56dad4db71STamas Berghammer   case 8:
57dad4db71STamas Berghammer     default_lib_path = default_lib64_path;
58dad4db71STamas Berghammer     break;
59dad4db71STamas Berghammer   default:
60dad4db71STamas Berghammer     assert(false && "Unknown address byte size");
61dad4db71STamas Berghammer     return FileSpec();
62dad4db71STamas Berghammer   }
63dad4db71STamas Berghammer 
64dad4db71STamas Berghammer   for (const char *const *it = default_lib_path; *it; ++it)
65dad4db71STamas Berghammer     ld_paths.push_back(StringRef(*it));
66dad4db71STamas Berghammer 
67*b9c1b51eSKate Stone   for (const StringRef &path : ld_paths) {
68dad4db71STamas Berghammer     FileSpec file_candidate(path.str().c_str(), true);
69dad4db71STamas Berghammer     file_candidate.AppendPathComponent(module_path.c_str());
70dad4db71STamas Berghammer 
71dad4db71STamas Berghammer     if (file_candidate.Exists())
72dad4db71STamas Berghammer       return file_candidate;
73dad4db71STamas Berghammer   }
74dad4db71STamas Berghammer 
75dad4db71STamas Berghammer   return FileSpec();
76dad4db71STamas Berghammer }
77f3a24329STamas Berghammer 
78*b9c1b51eSKate Stone bool HostInfoAndroid::ComputeTempFileBaseDirectory(FileSpec &file_spec) {
7933183147SPavel Labath   bool success = HostInfoLinux::ComputeTempFileBaseDirectory(file_spec);
80f3a24329STamas Berghammer 
81*b9c1b51eSKate Stone   // On Android, there is no path which is guaranteed to be writable. If the
82*b9c1b51eSKate Stone   // user has not
83*b9c1b51eSKate Stone   // provided a path via an environment variable, the generic algorithm will
84*b9c1b51eSKate Stone   // deduce /tmp, which
85*b9c1b51eSKate Stone   // is plain wrong. In that case we have an invalid directory, we substitute
86*b9c1b51eSKate Stone   // the path with
87*b9c1b51eSKate Stone   // /data/local/tmp, which is correct at least in some cases (i.e., when
88*b9c1b51eSKate Stone   // running as shell user).
8933183147SPavel Labath   if (!success || !file_spec.Exists())
90f3a24329STamas Berghammer     file_spec = FileSpec("/data/local/tmp", false);
9133183147SPavel Labath 
9233183147SPavel Labath   return file_spec.Exists();
93f3a24329STamas Berghammer }
94