You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tvm.apache.org by an...@apache.org on 2022/09/17 00:01:34 UTC
[tvm] 16/18: session optional
This is an automated email from the ASF dual-hosted git repository.
andrewzhaoluo pushed a commit to branch aluo/rebase-09162022-autotensorization
in repository https://gitbox.apache.org/repos/asf/tvm.git
commit f23f431c893b2ee214a4c18171abe10d31d06dfb
Author: Andrew Zhao Luo <an...@gmail.com>
AuthorDate: Fri Sep 2 15:18:13 2022 -0700
session optional
---
src/runtime/hexagon/rpc/simulator/session.cc | 113 ++++++++++++++++-----------
1 file changed, 68 insertions(+), 45 deletions(-)
diff --git a/src/runtime/hexagon/rpc/simulator/session.cc b/src/runtime/hexagon/rpc/simulator/session.cc
index 8943c0b4bf..0469ad5e6e 100644
--- a/src/runtime/hexagon/rpc/simulator/session.cc
+++ b/src/runtime/hexagon/rpc/simulator/session.cc
@@ -18,6 +18,7 @@
*/
#include <HexagonWrapper.h>
+#include <dmlc/optional.h>
#include <tvm/runtime/packed_func.h>
#include <tvm/runtime/registry.h>
// POSIX includes
@@ -30,7 +31,6 @@
#include <iterator>
#include <map>
#include <memory>
-#include <optional>
#include <sstream>
#include <string>
#include <utility>
@@ -55,6 +55,19 @@ using string_list = std::deque<std::string>;
namespace detail {
+// An "Optional" class, originally a replacement for llvm::Optional, then an
+// extension of dmlc::optional to make it compatible with C++17's std::optional.
+template <typename T>
+struct Optional : public dmlc::optional<T> {
+ using dmlc::optional<T>::optional;
+ using dmlc::optional<T>::operator=;
+ Optional(const T& val) : dmlc::optional<T>(val) {} // NOLINT(*)
+ Optional() = default;
+
+ T* operator->() { return &this->operator*(); }
+ const T* operator->() const { return &this->operator*(); }
+};
+
// Replacement for llvm::StringSwitch.
template <typename T>
class StringSwitch {
@@ -81,10 +94,10 @@ class StringSwitch {
private:
const std::string key;
std::map<std::string, T> map;
- std::optional<T> def_val;
+ Optional<T> def_val;
};
-using MaybeString = std::optional<std::string>;
+using MaybeString = Optional<std::string>;
MaybeString front(const string_list& deq) {
return !deq.empty() ? MaybeString(deq.front()) : MaybeString();
@@ -99,60 +112,65 @@ MaybeString pop_front(string_list& deq) { // NOLINT(*)
// Functions used when parsing the argument string.
-std::optional<int64_t> to_int(const MaybeString& str) {
+Optional<int64_t> to_int(const MaybeString& str) {
+ auto none = Optional<int64_t>();
if (str.has_value()) {
try {
size_t pos;
int64_t val = std::stoll(*str, &pos, 0);
- return pos == str->size() ? std::optional<int64_t>(val) : std::nullopt;
+ return pos == str->size() ? Optional<int64_t>(val) : none;
} catch (std::invalid_argument&) {
}
}
- return std::nullopt;
+ return none;
}
-std::optional<uint64_t> to_uint(const MaybeString& str) {
+Optional<uint64_t> to_uint(const MaybeString& str) {
+ auto none = Optional<uint64_t>();
if (str.has_value()) {
try {
size_t pos;
uint64_t val = std::stoull(*str, &pos, 0);
- return pos == str->size() ? std::optional<uint64_t>(val) : std::nullopt;
+ return pos == str->size() ? Optional<uint64_t>(val) : none;
} catch (std::invalid_argument&) {
}
}
- return std::nullopt;
+ return none;
}
-std::optional<float> to_float(const MaybeString& str) {
+Optional<float> to_float(const MaybeString& str) {
+ auto none = Optional<float>();
if (str.has_value()) {
try {
size_t pos;
float val = std::stof(*str, &pos);
- return pos == str->size() ? std::optional<float>(val) : std::nullopt;
+ return pos == str->size() ? Optional<float>(val) : none;
} catch (std::invalid_argument&) {
}
}
- return std::nullopt;
+ return none;
}
-std::optional<bool> to_bool(const MaybeString& str) {
+Optional<bool> to_bool(const MaybeString& str) {
+ auto none = Optional<bool>();
if (auto num = to_int(str)) {
if (*num == 0) return false;
if (*num == 1) return true;
- return std::nullopt;
+ return none;
}
if (str) {
if (*str == "true" || *str == "TRUE") return true;
if (*str == "false" || *str == "FALSE") return false;
}
- return std::nullopt;
+ return none;
}
template <typename T>
-using MaybeRange = std::optional<std::pair<T, T>>;
+using MaybeRange = Optional<std::pair<T, T>>;
-template <typename T, std::optional<T> Parse(const MaybeString&)>
+template <typename T, Optional<T> Parse(const MaybeString&)>
MaybeRange<T> to_range(const MaybeString& str) {
+ auto none = MaybeRange<T>();
if (str && !str->empty()) {
auto n = str->find('-', 1);
if (n != std::string::npos) {
@@ -163,7 +181,7 @@ MaybeRange<T> to_range(const MaybeString& str) {
}
}
}
- return std::nullopt;
+ return none;
}
} // namespace detail
@@ -209,7 +227,7 @@ class SimulatorRPCChannel final : public RPCChannel {
static HEX_8u_t PassVirtAddrCallback(void* handle, int threadno, HEX_8u_t RssV, HEX_8u_t RttV,
HEX_8u_t RxxV, HEX_1u_t imm);
- std::optional<HEXAPI_Cpu> GetCPU(const detail::MaybeString& cpu_str);
+ detail::Optional<HEXAPI_Cpu> GetCPU(const detail::MaybeString& cpu_str);
// File name templates for mkstemps.
#define SUFFIX ".cfg"
@@ -288,17 +306,17 @@ class SimulatorRPCChannel final : public RPCChannel {
bool HandleV2PTranslation(string_list& rest); // NOLINT(*)
bool HandleVerbose(string_list& rest); // NOLINT(*)
- using MaybeUInt64 = std::optional<uint64_t>;
+ using MaybeUInt64 = detail::Optional<uint64_t>;
using MaybeUIntRange = std::pair<MaybeUInt64, MaybeUInt64>;
bool should_parse_next(const string_list& rest);
- std::optional<HEXAPI_Interval> to_interval(const detail::MaybeString& str);
- std::optional<HEXAPI_TimingMode> to_timingmode(const detail::MaybeString& str);
- std::optional<HEXAPI_VerboseMode> to_verbosemode(const detail::MaybeString& str);
- std::optional<HEXAPI_Nullptr> to_nullptr(const detail::MaybeString& str);
+ detail::Optional<HEXAPI_Interval> to_interval(const detail::MaybeString& str);
+ detail::Optional<HEXAPI_TimingMode> to_timingmode(const detail::MaybeString& str);
+ detail::Optional<HEXAPI_VerboseMode> to_verbosemode(const detail::MaybeString& str);
+ detail::Optional<HEXAPI_Nullptr> to_nullptr(const detail::MaybeString& str);
MaybeUIntRange ahb_, axi2_;
- std::optional<uint32_t> debug_port_;
+ detail::Optional<uint32_t> debug_port_;
using OptionHandler = bool (SimulatorRPCChannel::*)(string_list&);
static std::map<std::string, OptionHandler> opt_map_;
@@ -538,14 +556,15 @@ HEX_8u_t SimulatorRPCChannel::PassVirtAddrCallback(void* handle, int threadno, H
return RssV;
}
-std::optional<HEXAPI_Cpu> SimulatorRPCChannel::GetCPU(const detail::MaybeString& cpu_str) {
- if (!cpu_str) return std::nullopt;
- return detail::StringSwitch<std::optional<HEXAPI_Cpu>>(*cpu_str)
+detail::Optional<HEXAPI_Cpu> SimulatorRPCChannel::GetCPU(const detail::MaybeString& cpu_str) {
+ auto none = detail::Optional<HEXAPI_Cpu>();
+ if (!cpu_str) return none;
+ return detail::StringSwitch<detail::Optional<HEXAPI_Cpu>>(*cpu_str)
.Case("v65", HEX_CPU_V65)
.Case("v66", HEX_CPU_V66)
.Case("v68", HEX_CPU_V68)
.Case("v69", HEX_CPU_V69)
- .Default(std::nullopt);
+ .Default(none);
}
SimulatorRPCChannel::SimulatorRPCChannel(int stack_size, std::string args) {
@@ -1246,8 +1265,9 @@ bool SimulatorRPCChannel::should_parse_next(const string_list& rest) {
return false;
}
-std::optional<HEXAPI_Interval> SimulatorRPCChannel::to_interval(const detail::MaybeString& str) {
- if (!str) return std::nullopt;
+detail::Optional<HEXAPI_Interval> SimulatorRPCChannel::to_interval(const detail::MaybeString& str) {
+ auto none = detail::Optional<HEXAPI_Interval>();
+ if (!str) return none;
if (auto val = detail::to_int(*str)) {
switch (*val) {
@@ -1260,18 +1280,19 @@ std::optional<HEXAPI_Interval> SimulatorRPCChannel::to_interval(const detail::Ma
}
}
- return detail::StringSwitch<std::optional<HEXAPI_Interval>>(*str)
+ return detail::StringSwitch<detail::Optional<HEXAPI_Interval>>(*str)
.Case("MILLISEC", HEX_MILLISEC)
.Case("MICROSEC", HEX_MICROSEC)
.Case("NANOSEC", HEX_NANOSEC)
.Case("PICOSEC", HEX_PICOSEC)
.Case("PCYCLE", HEX_PCYCLE)
- .Default(std::nullopt);
+ .Default(none);
}
-std::optional<HEXAPI_TimingMode> SimulatorRPCChannel::to_timingmode(
+detail::Optional<HEXAPI_TimingMode> SimulatorRPCChannel::to_timingmode(
const detail::MaybeString& str) {
- if (!str) return std::nullopt;
+ auto none = detail::Optional<HEXAPI_TimingMode>();
+ if (!str) return none;
if (auto val = detail::to_int(*str)) {
switch (*val) {
@@ -1283,17 +1304,18 @@ std::optional<HEXAPI_TimingMode> SimulatorRPCChannel::to_timingmode(
}
}
- return detail::StringSwitch<std::optional<HEXAPI_TimingMode>>(*str)
+ return detail::StringSwitch<detail::Optional<HEXAPI_TimingMode>>(*str)
.Case("NOTIMING", HEX_NOTIMING)
.Case("TIMING_NODBC", HEX_TIMING_NODBC)
.Case("TIMING", HEX_TIMING)
.Case("TIMING_COHERENCY", HEX_TIMING_COHERENCY)
- .Default(std::nullopt);
+ .Default(none);
}
-std::optional<HEXAPI_VerboseMode> SimulatorRPCChannel::to_verbosemode(
+detail::Optional<HEXAPI_VerboseMode> SimulatorRPCChannel::to_verbosemode(
const detail::MaybeString& str) {
- if (!str) return std::nullopt;
+ auto none = detail::Optional<HEXAPI_VerboseMode>();
+ if (!str) return none;
if (auto val = detail::to_int(*str)) {
switch (*val) {
@@ -1306,17 +1328,18 @@ std::optional<HEXAPI_VerboseMode> SimulatorRPCChannel::to_verbosemode(
}
}
- return detail::StringSwitch<std::optional<HEXAPI_VerboseMode>>(*str)
+ return detail::StringSwitch<detail::Optional<HEXAPI_VerboseMode>>(*str)
.Case("SILENT", HEX_SILENT)
.Case("QUIET", HEX_QUIET)
.Case("NORMAL", HEX_NORMAL)
.Case("VERBOSE", HEX_VERBOSE)
.Case("REALLY_VERBOSE", HEX_REALLY_VERBOSE)
- .Default(std::nullopt);
+ .Default(none);
}
-std::optional<HEXAPI_Nullptr> SimulatorRPCChannel::to_nullptr(const detail::MaybeString& str) {
- if (!str) return std::nullopt;
+detail::Optional<HEXAPI_Nullptr> SimulatorRPCChannel::to_nullptr(const detail::MaybeString& str) {
+ auto none = detail::Optional<HEXAPI_Nullptr>();
+ if (!str) return none;
if (auto val = detail::to_int(*str)) {
switch (*val) {
@@ -1328,12 +1351,12 @@ std::optional<HEXAPI_Nullptr> SimulatorRPCChannel::to_nullptr(const detail::Mayb
}
}
- return detail::StringSwitch<std::optional<HEXAPI_Nullptr>>(*str)
+ return detail::StringSwitch<detail::Optional<HEXAPI_Nullptr>>(*str)
.Case("IGNORE", HEX_NULLPTR_IGNORE)
.Case("WARN", HEX_NULLPTR_WARN)
.Case("FATAL", HEX_NULLPTR_FATAL)
.Case("PCZERO", HEX_NULLPTR_PCZERO)
- .Default(std::nullopt);
+ .Default(none);
}
TVM_REGISTER_GLOBAL("tvm.contrib.hexagon.create_hexagon_session")