aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/util/rust-canonical-path.h
diff options
context:
space:
mode:
authorPhilip Herron <philip.herron@embecosm.com>2022-01-29 14:55:51 +0000
committerPhilip Herron <philip.herron@embecosm.com>2022-01-29 14:56:27 +0000
commit2fbf9cb25e930e2df86d05e0f7f707e69bae2b1f (patch)
treef5fc89773ab1941593f3f2230908919063679c68 /gcc/rust/util/rust-canonical-path.h
parenta065f205c3171e63b4efee0b9d890782e95a691b (diff)
downloadgcc-2fbf9cb25e930e2df86d05e0f7f707e69bae2b1f.zip
gcc-2fbf9cb25e930e2df86d05e0f7f707e69bae2b1f.tar.gz
gcc-2fbf9cb25e930e2df86d05e0f7f707e69bae2b1f.tar.bz2
Track the cratenum for the respective canonical path
This means we can get the crate name to squash the warning in the V0 symbol mangling scheme.
Diffstat (limited to 'gcc/rust/util/rust-canonical-path.h')
-rw-r--r--gcc/rust/util/rust-canonical-path.h33
1 files changed, 21 insertions, 12 deletions
diff --git a/gcc/rust/util/rust-canonical-path.h b/gcc/rust/util/rust-canonical-path.h
index 6ac8968..9b34075 100644
--- a/gcc/rust/util/rust-canonical-path.h
+++ b/gcc/rust/util/rust-canonical-path.h
@@ -57,7 +57,8 @@ public:
static CanonicalPath new_seg (NodeId id, const std::string &path)
{
rust_assert (!path.empty ());
- return CanonicalPath ({std::pair<NodeId, std::string> (id, path)});
+ return CanonicalPath ({std::pair<NodeId, std::string> (id, path)},
+ UNKNOWN_CREATENUM);
}
std::string get () const
@@ -77,7 +78,10 @@ public:
return CanonicalPath::new_seg (id, "Self");
}
- static CanonicalPath create_empty () { return CanonicalPath ({}); }
+ static CanonicalPath create_empty ()
+ {
+ return CanonicalPath ({}, UNKNOWN_CREATENUM);
+ }
bool is_empty () const { return segs.size () == 0; }
@@ -85,13 +89,13 @@ public:
{
rust_assert (!other.is_empty ());
if (is_empty ())
- return CanonicalPath (other.segs);
+ return CanonicalPath (other.segs, crate_num);
std::vector<std::pair<NodeId, std::string>> copy (segs);
for (auto &s : other.segs)
copy.push_back (s);
- return CanonicalPath (copy);
+ return CanonicalPath (copy, crate_num);
}
// if we have the path A::B::C this will give a callback for each segment
@@ -110,7 +114,7 @@ public:
for (auto &seg : segs)
{
buf.push_back (seg);
- if (!cb (CanonicalPath (buf)))
+ if (!cb (CanonicalPath (buf, crate_num)))
return;
}
}
@@ -131,7 +135,7 @@ public:
{
std::vector<std::pair<NodeId, std::string>> buf;
buf.push_back ({seg.first, seg.second});
- if (!cb (CanonicalPath (buf)))
+ if (!cb (CanonicalPath (buf, crate_num)))
return;
}
}
@@ -150,14 +154,17 @@ public:
return segs.at (index);
}
- static bool segment_is_qualified_path (const std::string &seg)
+ bool is_equal (const CanonicalPath &b) const
{
- return seg.find (" as ") != std::string::npos;
+ return get ().compare (b.get ()) == 0;
}
- bool is_equal (const CanonicalPath &b) const
+ void set_crate_num (CrateNum n) { crate_num = n; }
+
+ CrateNum get_crate_num () const
{
- return get ().compare (b.get ()) == 0;
+ rust_assert (crate_num != UNKNOWN_CREATENUM);
+ return crate_num;
}
bool operator== (const CanonicalPath &b) const { return is_equal (b); }
@@ -165,11 +172,13 @@ public:
bool operator< (const CanonicalPath &b) const { return get () < b.get (); }
private:
- explicit CanonicalPath (std::vector<std::pair<NodeId, std::string>> path)
- : segs (path)
+ explicit CanonicalPath (std::vector<std::pair<NodeId, std::string>> path,
+ CrateNum crate_num)
+ : segs (path), crate_num (crate_num)
{}
std::vector<std::pair<NodeId, std::string>> segs;
+ CrateNum crate_num;
};
} // namespace Resolver