ValueObjectSP GoUserExpression::GoInterpreter::VisitBasicLit(const lldb_private::GoASTBasicLit *e) { std::string value = e->GetValue().m_value.str(); if (e->GetValue().m_type != GoLexer::LIT_INTEGER) { m_error.SetErrorStringWithFormat("Unsupported literal %s", value.c_str()); return nullptr; } errno = 0; int64_t intvalue = strtol(value.c_str(), nullptr, 0); if (errno != 0) { m_error.SetErrorToErrno(); return nullptr; } DataBufferSP buf(new DataBufferHeap(sizeof(intvalue), 0)); TargetSP target = m_exe_ctx.GetTargetSP(); if (!target) { m_error.SetErrorString("No target"); return nullptr; } ByteOrder order = target->GetArchitecture().GetByteOrder(); uint8_t addr_size = target->GetArchitecture().GetAddressByteSize(); DataEncoder enc(buf, order, addr_size); enc.PutU64(0, static_cast<uint64_t>(intvalue)); DataExtractor data(buf, order, addr_size); CompilerType type = LookupType(target, ConstString("int64")); return ValueObject::CreateValueObjectFromData(nullptr, data, m_exe_ctx, type); }
bool ProcessKDP::CanDebug(TargetSP target_sp, bool plugin_specified_by_name) { if (plugin_specified_by_name) return true; // For now we are just making sure the file exists for a given module Module *exe_module = target_sp->GetExecutableModulePointer(); if (exe_module) { const llvm::Triple &triple_ref = target_sp->GetArchitecture().GetTriple(); switch (triple_ref.getOS()) { case llvm::Triple::Darwin: // Should use "macosx" for desktop and "ios" for iOS, but accept darwin just in case case llvm::Triple::MacOSX: // For desktop targets case llvm::Triple::IOS: // For arm targets if (triple_ref.getVendor() == llvm::Triple::Apple) { ObjectFile *exe_objfile = exe_module->GetObjectFile(); if (exe_objfile->GetType() == ObjectFile::eTypeExecutable && exe_objfile->GetStrata() == ObjectFile::eStrataKernel) return true; } break; default: break; } } return false; }