aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/rust-session-manager.h
diff options
context:
space:
mode:
authorOwen Avery <powerboat9.gamer@gmail.com>2023-05-19 00:05:19 -0400
committerArthur Cohen <arthur.cohen@embecosm.com>2024-01-16 18:37:22 +0100
commitfc281773251e2c565c0fbf3872d240615cae021a (patch)
tree63be26dc608ba172eabdeff96b9dd823b1b10a9f /gcc/rust/rust-session-manager.h
parent1b34e40e5e41bdcb227b40523cd3a64c6f2fde00 (diff)
downloadgcc-fc281773251e2c565c0fbf3872d240615cae021a.zip
gcc-fc281773251e2c565c0fbf3872d240615cae021a.tar.gz
gcc-fc281773251e2c565c0fbf3872d240615cae021a.tar.bz2
gccrs: Make key and key/value config options seperate
gcc/rust/ChangeLog: * rust-session-manager.h: Include "rust-optional.h". (struct TargetOptions): Store values in config key/value pairs as Optional<std::string> rather than std::string. * rust-session-manager.cc (TargetOptions::dump_target_options): Handle Optional<std::string> values. gcc/testsuite/ChangeLog: * rust/compile/cfg6.rs: New test. Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
Diffstat (limited to 'gcc/rust/rust-session-manager.h')
-rw-r--r--gcc/rust/rust-session-manager.h55
1 files changed, 41 insertions, 14 deletions
diff --git a/gcc/rust/rust-session-manager.h b/gcc/rust/rust-session-manager.h
index 7d8b14e..99abb3c 100644
--- a/gcc/rust/rust-session-manager.h
+++ b/gcc/rust/rust-session-manager.h
@@ -30,6 +30,8 @@
#include "coretypes.h"
#include "options.h"
+#include "rust-optional.h"
+
namespace Rust {
// parser forward decl
template <typename ManagedTokenSource> class Parser;
@@ -49,13 +51,17 @@ struct TargetOptions
{
/* TODO: maybe make private and access through helpers to allow changes to
* impl */
- std::unordered_map<std::string, std::unordered_set<std::string> > features;
+ std::unordered_map<std::string, std::unordered_set<Optional<std::string>>>
+ features;
public:
// Returns whether a key is defined in the feature set.
bool has_key (std::string key) const
{
- return features.find (key) != features.end ();
+ auto it = features.find (key);
+ return it != features.end ()
+ && it->second.find (Optional<std::string>::none ())
+ != it->second.end ();
}
// Returns whether a key exists with the given value in the feature set.
@@ -65,7 +71,7 @@ public:
if (it != features.end ())
{
auto set = it->second;
- auto it2 = set.find (value);
+ auto it2 = set.find (Optional<std::string>::some (value));
if (it2 != set.end ())
return true;
}
@@ -80,8 +86,8 @@ public:
if (it != features.end ())
{
auto set = it->second;
- if (set.size () == 1)
- return *set.begin ();
+ if (set.size () == 1 && set.begin ()->is_some ())
+ return set.begin ()->get ();
}
return "";
}
@@ -90,10 +96,17 @@ public:
* set if no key is found. */
std::unordered_set<std::string> get_values_for_key (std::string key) const
{
+ std::unordered_set<std::string> ret;
+
auto it = features.find (key);
- if (it != features.end ())
- return it->second;
- return {};
+ if (it == features.end ())
+ return {};
+
+ for (auto &val : it->second)
+ if (val.is_some ())
+ ret.insert (val.get ());
+
+ return ret;
}
/* Inserts a key (no value) into the feature set. This will do nothing if
@@ -101,17 +114,31 @@ public:
* (i.e. whether key already existed). */
bool insert_key (std::string key)
{
- return features
- .insert (std::make_pair (key, std::unordered_set<std::string> ()))
- .second;
+ auto it = features.find (key);
+
+ if (it == features.end ())
+ it = features
+ .insert (
+ std::make_pair (std::move (key),
+ std::unordered_set<Optional<std::string>> ()))
+ .first;
+
+ return it->second.insert (Optional<std::string>::none ()).second;
}
// Inserts a key-value pair into the feature set.
void insert_key_value_pair (std::string key, std::string value)
{
- auto existing_set = get_values_for_key (key);
- existing_set.insert (std::move (value));
- features[std::move (key)] = std::move (existing_set);
+ auto it = features.find (key);
+
+ if (it == features.end ())
+ it = features
+ .insert (
+ std::make_pair (std::move (key),
+ std::unordered_set<Optional<std::string>> ()))
+ .first;
+
+ it->second.insert (Optional<std::string>::some (std::move (value)));
}
// Dump all target options to stderr.