static bool COFFMachineToMachCPU (uint16_t machine, ArchSpec &arch) { switch (machine) { case IMAGE_FILE_MACHINE_AMD64: case IMAGE_FILE_MACHINE_IA64: arch.SetArchitecture (eArchTypeMachO, llvm::MachO::CPUTypeX86_64, llvm::MachO::CPUSubType_X86_64_ALL); return true; case IMAGE_FILE_MACHINE_I386: arch.SetArchitecture (eArchTypeMachO, llvm::MachO::CPUTypeI386, llvm::MachO::CPUSubType_I386_ALL); return true; case IMAGE_FILE_MACHINE_POWERPC: case IMAGE_FILE_MACHINE_POWERPCFP: arch.SetArchitecture (eArchTypeMachO, llvm::MachO::CPUTypePowerPC, llvm::MachO::CPUSubType_POWERPC_ALL); return true; case IMAGE_FILE_MACHINE_ARM: case IMAGE_FILE_MACHINE_THUMB: arch.SetArchitecture (eArchTypeMachO, llvm::MachO::CPUTypeARM, llvm::MachO::CPUSubType_ARM_V7); return true; } return false; }
bool ObjectContainerUniversalMachO::GetArchitectureAtIndex( uint32_t idx, ArchSpec &arch) const { if (idx < m_header.nfat_arch) { arch.SetArchitecture(eArchTypeMachO, m_fat_archs[idx].cputype, m_fat_archs[idx].cpusubtype); return true; } return false; }
bool ObjectFileELF::GetArchitecture (ArchSpec &arch) { if (!ParseHeader()) return false; arch.SetArchitecture (eArchTypeELF, m_header.e_machine, LLDB_INVALID_CPUTYPE); arch.GetTriple().setOSName (Host::GetOSString().GetCString()); arch.GetTriple().setVendorName(Host::GetVendorString().GetCString()); return true; }
static bool ParseMachCPUDashSubtypeTriple (const char *triple_cstr, ArchSpec &arch) { // Accept "12-10" or "12.10" as cpu type/subtype if (isdigit(triple_cstr[0])) { char *end = NULL; errno = 0; uint32_t cpu = ::strtoul (triple_cstr, &end, 0); if (errno == 0 && cpu != 0 && end && ((*end == '-') || (*end == '.'))) { errno = 0; uint32_t sub = ::strtoul (end + 1, &end, 0); if (errno == 0 && end && ((*end == '-') || (*end == '.') || (*end == '\0'))) { if (arch.SetArchitecture (eArchTypeMachO, cpu, sub)) { if (*end == '-') { llvm::StringRef vendor_os (end + 1); size_t dash_pos = vendor_os.find('-'); if (dash_pos != llvm::StringRef::npos) { llvm::StringRef vendor_str(vendor_os.substr(0, dash_pos)); arch.GetTriple().setVendorName(vendor_str); const size_t vendor_start_pos = dash_pos+1; dash_pos = vendor_os.find(vendor_start_pos, '-'); if (dash_pos == llvm::StringRef::npos) { if (vendor_start_pos < vendor_os.size()) arch.GetTriple().setOSName(vendor_os.substr(vendor_start_pos)); } else { arch.GetTriple().setOSName(vendor_os.substr(vendor_start_pos, dash_pos - vendor_start_pos)); } } } return true; } } } } return false; }
void ProcessKDP::DidAttach (ArchSpec &process_arch) { Process::DidAttach(process_arch); Log *log (ProcessKDPLog::GetLogIfAllCategoriesSet (KDP_LOG_PROCESS)); if (log) log->Printf ("ProcessKDP::DidAttach()"); if (GetID() != LLDB_INVALID_PROCESS_ID) { uint32_t cpu = m_comm.GetCPUType(); if (cpu) { uint32_t sub = m_comm.GetCPUSubtype(); process_arch.SetArchitecture(eArchTypeMachO, cpu, sub); } } }
bool ObjectFilePECOFF::GetArchitecture(ArchSpec &arch) { uint16_t machine = m_coff_header.machine; switch (machine) { case llvm::COFF::IMAGE_FILE_MACHINE_AMD64: case llvm::COFF::IMAGE_FILE_MACHINE_I386: case llvm::COFF::IMAGE_FILE_MACHINE_POWERPC: case llvm::COFF::IMAGE_FILE_MACHINE_POWERPCFP: case llvm::COFF::IMAGE_FILE_MACHINE_ARM: case llvm::COFF::IMAGE_FILE_MACHINE_ARMNT: case llvm::COFF::IMAGE_FILE_MACHINE_THUMB: arch.SetArchitecture(eArchTypeCOFF, machine, LLDB_INVALID_CPUTYPE, IsWindowsSubsystem() ? llvm::Triple::Win32 : llvm::Triple::UnknownOS); return true; default: break; } return false; }
const ArchSpec & Host::GetArchitecture (SystemDefaultArchitecture arch_kind) { static bool g_supports_32 = false; static bool g_supports_64 = false; static ArchSpec g_host_arch_32; static ArchSpec g_host_arch_64; #if defined (__APPLE__) // Apple is different in that it can support both 32 and 64 bit executables // in the same operating system running concurrently. Here we detect the // correct host architectures for both 32 and 64 bit including if 64 bit // executables are supported on the system. if (g_supports_32 == false && g_supports_64 == false) { // All apple systems support 32 bit execution. g_supports_32 = true; uint32_t cputype, cpusubtype; uint32_t is_64_bit_capable = false; size_t len = sizeof(cputype); ArchSpec host_arch; // These will tell us about the kernel architecture, which even on a 64 // bit machine can be 32 bit... if (::sysctlbyname("hw.cputype", &cputype, &len, NULL, 0) == 0) { len = sizeof (cpusubtype); if (::sysctlbyname("hw.cpusubtype", &cpusubtype, &len, NULL, 0) != 0) cpusubtype = CPU_TYPE_ANY; len = sizeof (is_64_bit_capable); if (::sysctlbyname("hw.cpu64bit_capable", &is_64_bit_capable, &len, NULL, 0) == 0) { if (is_64_bit_capable) g_supports_64 = true; } if (is_64_bit_capable) { #if defined (__i386__) || defined (__x86_64__) if (cpusubtype == CPU_SUBTYPE_486) cpusubtype = CPU_SUBTYPE_I386_ALL; #endif if (cputype & CPU_ARCH_ABI64) { // We have a 64 bit kernel on a 64 bit system g_host_arch_32.SetArchitecture (eArchTypeMachO, ~(CPU_ARCH_MASK) & cputype, cpusubtype); g_host_arch_64.SetArchitecture (eArchTypeMachO, cputype, cpusubtype); } else { // We have a 32 bit kernel on a 64 bit system g_host_arch_32.SetArchitecture (eArchTypeMachO, cputype, cpusubtype); cputype |= CPU_ARCH_ABI64; g_host_arch_64.SetArchitecture (eArchTypeMachO, cputype, cpusubtype); } } else { g_host_arch_32.SetArchitecture (eArchTypeMachO, cputype, cpusubtype); g_host_arch_64.Clear(); } } } #else // #if defined (__APPLE__) if (g_supports_32 == false && g_supports_64 == false) { llvm::Triple triple(llvm::sys::getDefaultTargetTriple()); g_host_arch_32.Clear(); g_host_arch_64.Clear(); switch (triple.getArch()) { default: g_host_arch_32.SetTriple(triple); g_supports_32 = true; break; case llvm::Triple::x86_64: case llvm::Triple::sparcv9: case llvm::Triple::ppc64: case llvm::Triple::cellspu: g_host_arch_64.SetTriple(triple); g_supports_64 = true; break; } g_supports_32 = g_host_arch_32.IsValid(); g_supports_64 = g_host_arch_64.IsValid(); } #endif // #else for #if defined (__APPLE__) if (arch_kind == eSystemDefaultArchitecture32) return g_host_arch_32; else if (arch_kind == eSystemDefaultArchitecture64) return g_host_arch_64; if (g_supports_64) return g_host_arch_64; return g_host_arch_32; }