aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/analysis
diff options
context:
space:
mode:
authorThomas Young <wenzhang5800@gmail.com>2021-06-15 10:26:49 +0800
committerThomas Young <wenzhang5800@gmail.com>2021-06-15 10:26:49 +0800
commitba9728b401879691c81b8315e97f82a7c72826c8 (patch)
treeedd550ab7d6d3c26c36603c8861d4e758649e4d4 /gcc/rust/analysis
parent59f8d7a2343cd326e905be618c820387cf13afb7 (diff)
downloadgcc-ba9728b401879691c81b8315e97f82a7c72826c8.zip
gcc-ba9728b401879691c81b8315e97f82a7c72826c8.tar.gz
gcc-ba9728b401879691c81b8315e97f82a7c72826c8.tar.bz2
replace analysis dir with lint dir and rename liveness to marklive
Diffstat (limited to 'gcc/rust/analysis')
-rw-r--r--gcc/rust/analysis/rust-hir-liveness-base.h208
-rw-r--r--gcc/rust/analysis/rust-hir-liveness.cc166
-rw-r--r--gcc/rust/analysis/rust-hir-liveness.h153
-rw-r--r--gcc/rust/analysis/rust-hir-scan-deadcode.h68
4 files changed, 0 insertions, 595 deletions
diff --git a/gcc/rust/analysis/rust-hir-liveness-base.h b/gcc/rust/analysis/rust-hir-liveness-base.h
deleted file mode 100644
index e8a1682..0000000
--- a/gcc/rust/analysis/rust-hir-liveness-base.h
+++ /dev/null
@@ -1,208 +0,0 @@
-// Copyright (C) 2021 Free Software Foundation, Inc.
-
-// This file is part of GCC.
-
-// GCC is free software; you can redistribute it and/or modify it under
-// the terms of the GNU General Public License as published by the Free
-// Software Foundation; either version 3, or (at your option) any later
-// version.
-
-// GCC is distributed in the hope that it will be useful, but WITHOUT ANY
-// WARRANTY; without even the implied warranty of MERCHANTABILITY or
-// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-// for more details.
-
-// You should have received a copy of the GNU General Public License
-// along with GCC; see the file COPYING3. If not see
-// <http://www.gnu.org/licenses/>.
-
-#ifndef RUST_HIR_LIVENESS_BASE
-#define RUST_HIR_LIVENESS_BASE
-
-#include "rust-diagnostics.h"
-#include "rust-hir-liveness.h"
-#include "rust-hir-liveness-base.h"
-#include "rust-hir-visitor.h"
-#include "rust-hir-map.h"
-
-namespace Rust {
-namespace Analysis {
-
-class LivenessBase : public HIR::HIRVisitor
-{
-public:
- virtual ~LivenessBase () {}
-
- virtual void visit (HIR::IdentifierExpr &) override {}
- virtual void visit (HIR::Lifetime &) override {}
- virtual void visit (HIR::LifetimeParam &) override {}
- virtual void visit (HIR::PathInExpression &) override {}
- virtual void visit (HIR::TypePathSegment &) override {}
- virtual void visit (HIR::TypePathSegmentGeneric &) override {}
- virtual void visit (HIR::TypePathSegmentFunction &) override {}
- virtual void visit (HIR::TypePath &) override {}
- virtual void visit (HIR::QualifiedPathInExpression &) override {}
- virtual void visit (HIR::QualifiedPathInType &) override {}
-
- virtual void visit (HIR::LiteralExpr &) override {}
- virtual void visit (HIR::BorrowExpr &) override {}
- virtual void visit (HIR::DereferenceExpr &) override {}
- virtual void visit (HIR::ErrorPropagationExpr &) override {}
- virtual void visit (HIR::NegationExpr &) override {}
- virtual void visit (HIR::ArithmeticOrLogicalExpr &) override {}
- virtual void visit (HIR::ComparisonExpr &) override {}
- virtual void visit (HIR::LazyBooleanExpr &) override {}
- virtual void visit (HIR::TypeCastExpr &) override {}
- virtual void visit (HIR::AssignmentExpr &) override {}
-
- virtual void visit (HIR::GroupedExpr &) override {}
-
- virtual void visit (HIR::ArrayElemsValues &) override {}
- virtual void visit (HIR::ArrayElemsCopied &) override {}
- virtual void visit (HIR::ArrayExpr &) override {}
- virtual void visit (HIR::ArrayIndexExpr &) override {}
- virtual void visit (HIR::TupleExpr &) override {}
- virtual void visit (HIR::TupleIndexExpr &) override {}
- virtual void visit (HIR::StructExprStruct &) override {}
-
- virtual void visit (HIR::StructExprFieldIdentifier &) override {}
- virtual void visit (HIR::StructExprFieldIdentifierValue &) override {}
-
- virtual void visit (HIR::StructExprFieldIndexValue &) override {}
- virtual void visit (HIR::StructExprStructFields &) override {}
- virtual void visit (HIR::StructExprStructBase &) override {}
- virtual void visit (HIR::StructExprTuple &) override {}
- virtual void visit (HIR::StructExprUnit &) override {}
-
- virtual void visit (HIR::EnumExprFieldIdentifier &) override {}
- virtual void visit (HIR::EnumExprFieldIdentifierValue &) override {}
-
- virtual void visit (HIR::EnumExprFieldIndexValue &) override {}
- virtual void visit (HIR::EnumExprStruct &) override {}
- virtual void visit (HIR::EnumExprTuple &) override {}
- virtual void visit (HIR::EnumExprFieldless &) override {}
- virtual void visit (HIR::CallExpr &) override {}
- virtual void visit (HIR::MethodCallExpr &) override {}
- virtual void visit (HIR::FieldAccessExpr &) override {}
- virtual void visit (HIR::ClosureExprInner &) override {}
- virtual void visit (HIR::BlockExpr &) override {}
- virtual void visit (HIR::ClosureExprInnerTyped &) override {}
- virtual void visit (HIR::ContinueExpr &) override {}
- virtual void visit (HIR::BreakExpr &) override {}
- virtual void visit (HIR::RangeFromToExpr &) override {}
- virtual void visit (HIR::RangeFromExpr &) override {}
- virtual void visit (HIR::RangeToExpr &) override {}
- virtual void visit (HIR::RangeFullExpr &) override {}
- virtual void visit (HIR::RangeFromToInclExpr &) override {}
- virtual void visit (HIR::RangeToInclExpr &) override {}
- virtual void visit (HIR::ReturnExpr &) override {}
- virtual void visit (HIR::UnsafeBlockExpr &) override {}
- virtual void visit (HIR::LoopExpr &) override {}
- virtual void visit (HIR::WhileLoopExpr &) override {}
- virtual void visit (HIR::WhileLetLoopExpr &) override {}
- virtual void visit (HIR::ForLoopExpr &) override {}
- virtual void visit (HIR::IfExpr &) override {}
- virtual void visit (HIR::IfExprConseqElse &) override {}
- virtual void visit (HIR::IfExprConseqIf &) override {}
- virtual void visit (HIR::IfExprConseqIfLet &) override {}
- virtual void visit (HIR::IfLetExpr &) override {}
- virtual void visit (HIR::IfLetExprConseqElse &) override {}
- virtual void visit (HIR::IfLetExprConseqIf &) override {}
- virtual void visit (HIR::IfLetExprConseqIfLet &) override {}
-
- virtual void visit (HIR::MatchExpr &) override {}
- virtual void visit (HIR::AwaitExpr &) override {}
- virtual void visit (HIR::AsyncBlockExpr &) override {}
-
- virtual void visit (HIR::TypeParam &) override {}
-
- virtual void visit (HIR::LifetimeWhereClauseItem &) override {}
- virtual void visit (HIR::TypeBoundWhereClauseItem &) override {}
- virtual void visit (HIR::Method &) override {}
- virtual void visit (HIR::ModuleBodied &) override {}
- virtual void visit (HIR::ModuleNoBody &) override {}
- virtual void visit (HIR::ExternCrate &) override {}
-
- virtual void visit (HIR::UseTreeGlob &) override {}
- virtual void visit (HIR::UseTreeList &) override {}
- virtual void visit (HIR::UseTreeRebind &) override {}
- virtual void visit (HIR::UseDeclaration &) override {}
- virtual void visit (HIR::Function &) override {}
- virtual void visit (HIR::TypeAlias &) override {}
- virtual void visit (HIR::StructStruct &) override {}
- virtual void visit (HIR::TupleStruct &) override {}
- virtual void visit (HIR::EnumItem &) override {}
- virtual void visit (HIR::EnumItemTuple &) override {}
- virtual void visit (HIR::EnumItemStruct &) override {}
- virtual void visit (HIR::EnumItemDiscriminant &) override {}
- virtual void visit (HIR::Enum &) override {}
- virtual void visit (HIR::Union &) override {}
- virtual void visit (HIR::ConstantItem &) override {}
- virtual void visit (HIR::StaticItem &) override {}
- virtual void visit (HIR::TraitItemFunc &) override {}
- virtual void visit (HIR::TraitItemMethod &) override {}
- virtual void visit (HIR::TraitItemConst &) override {}
- virtual void visit (HIR::TraitItemType &) override {}
- virtual void visit (HIR::Trait &) override {}
- virtual void visit (HIR::InherentImpl &) override {}
- virtual void visit (HIR::TraitImpl &) override {}
-
- virtual void visit (HIR::ExternalStaticItem &) override {}
- virtual void visit (HIR::ExternalFunctionItem &) override {}
- virtual void visit (HIR::ExternBlock &) override {}
-
- virtual void visit (HIR::LiteralPattern &) override {}
- virtual void visit (HIR::IdentifierPattern &) override {}
- virtual void visit (HIR::WildcardPattern &) override {}
-
- virtual void visit (HIR::RangePatternBoundLiteral &) override {}
- virtual void visit (HIR::RangePatternBoundPath &) override {}
- virtual void visit (HIR::RangePatternBoundQualPath &) override {}
- virtual void visit (HIR::RangePattern &) override {}
- virtual void visit (HIR::ReferencePattern &) override {}
-
- virtual void visit (HIR::StructPatternFieldTuplePat &) override {}
- virtual void visit (HIR::StructPatternFieldIdentPat &) override {}
- virtual void visit (HIR::StructPatternFieldIdent &) override {}
- virtual void visit (HIR::StructPattern &) override {}
-
- virtual void visit (HIR::TupleStructItemsNoRange &) override {}
- virtual void visit (HIR::TupleStructItemsRange &) override {}
- virtual void visit (HIR::TupleStructPattern &) override {}
-
- virtual void visit (HIR::TuplePatternItemsMultiple &) override {}
- virtual void visit (HIR::TuplePatternItemsRanged &) override {}
- virtual void visit (HIR::TuplePattern &) override {}
- virtual void visit (HIR::GroupedPattern &) override {}
- virtual void visit (HIR::SlicePattern &) override {}
-
- virtual void visit (HIR::EmptyStmt &) override {}
- virtual void visit (HIR::LetStmt &) override {}
- virtual void visit (HIR::ExprStmtWithoutBlock &) override {}
- virtual void visit (HIR::ExprStmtWithBlock &) override {}
-
- virtual void visit (HIR::TraitBound &) override {}
- virtual void visit (HIR::ImplTraitType &) override {}
- virtual void visit (HIR::TraitObjectType &) override {}
- virtual void visit (HIR::ParenthesisedType &) override {}
- virtual void visit (HIR::ImplTraitTypeOneBound &) override {}
- virtual void visit (HIR::TraitObjectTypeOneBound &) override {}
- virtual void visit (HIR::TupleType &) override {}
- virtual void visit (HIR::NeverType &) override {}
- virtual void visit (HIR::RawPointerType &) override {}
- virtual void visit (HIR::ReferenceType &) override {}
- virtual void visit (HIR::ArrayType &) override {}
- virtual void visit (HIR::SliceType &) override {}
- virtual void visit (HIR::InferredType &) override {}
- virtual void visit (HIR::BareFunctionType &) override {}
-
-protected:
- LivenessBase () : mappings (Analysis::Mappings::get ()) {}
-
- Analysis::Mappings *mappings;
-};
-
-} // namespace Analysis
-} // namespace Rust
-
-#endif
diff --git a/gcc/rust/analysis/rust-hir-liveness.cc b/gcc/rust/analysis/rust-hir-liveness.cc
deleted file mode 100644
index e65c1eb..0000000
--- a/gcc/rust/analysis/rust-hir-liveness.cc
+++ /dev/null
@@ -1,166 +0,0 @@
-// Copyright (C) 2021 Free Software Foundation, Inc.
-
-// This file is part of GCC.
-
-// GCC is free software; you can redistribute it and/or modify it under
-// the terms of the GNU General Public License as published by the Free
-// Software Foundation; either version 3, or (at your option) any later
-// version.
-
-// GCC is distributed in the hope that it will be useful, but WITHOUT ANY
-// WARRANTY; without even the implied warranty of MERCHANTABILITY or
-// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-// for more details.
-
-// You should have received a copy of the GNU General Public License
-// along with GCC; see the file COPYING3. If not see
-// <http://www.gnu.org/licenses/>.
-
-#include "rust-hir-liveness.h"
-#include "rust-hir-full.h"
-#include "rust-name-resolver.h"
-
-namespace Rust {
-namespace Analysis {
-
-class FindEntryPoint : public LivenessBase
-{
- using Rust::Analysis::LivenessBase::visit;
-
-public:
- static std::vector<HirId> find (HIR::Crate &crate)
- {
- FindEntryPoint findEntryPoint;
- for (auto it = crate.items.begin (); it != crate.items.end (); it++)
- {
- it->get ()->accept_vis (findEntryPoint);
- }
- return findEntryPoint.getEntryPoint ();
- }
-
- // TODO not only fn main can be a entry point.
- void visit (HIR::Function &function) override
- {
- if (function.get_function_name () == "main")
- {
- entryPoints.push_back (function.get_mappings ().get_hirid ());
- }
- }
-
-private:
- FindEntryPoint () : LivenessBase () {}
- std::vector<HirId> entryPoints;
- std::vector<HirId> getEntryPoint () { return entryPoints; }
-};
-
-std::set<HirId>
-Liveness::Analysis (HIR::Crate &crate)
-{
- Liveness liveness (FindEntryPoint::find (crate));
- liveness.go (crate);
-
- return liveness.liveSymbols;
-}
-
-void
-Liveness::go (HIR::Crate &crate)
-{
- CrateNum crateNum = crate.get_mappings ().get_crate_num ();
- while (!worklist.empty ())
- {
- HirId hirId = worklist.back ();
- worklist.pop_back ();
- scannedSymbols.emplace (hirId);
- HIR::Item *item = mappings->lookup_hir_item (crateNum, hirId);
- liveSymbols.emplace (hirId);
- if (item != nullptr)
- {
- item->accept_vis (*this);
- }
- else
- { // the item maybe inside a trait impl
- HirId parent_impl_id = UNKNOWN_HIRID;
- HIR::InherentImplItem *implItem
- = mappings->lookup_hir_implitem (crateNum, hirId, &parent_impl_id);
- if (implItem != nullptr)
- implItem->accept_vis (*this);
- }
- }
-}
-
-void
-Liveness::visit (HIR::PathInExpression &expr)
-{
- NodeId ast_node_id = expr.get_mappings ().get_nodeid ();
- NodeId ref_node_id = UNKNOWN_NODEID;
- if (resolver->lookup_resolved_name (ast_node_id, &ref_node_id))
- {
- Resolver::Definition def;
- if (!resolver->lookup_definition (ref_node_id, &def))
- {
- rust_error_at (expr.get_locus (),
- "unknown reference for resolved name");
- return;
- }
- ref_node_id = def.parent;
- HirId ref;
- if (!mappings->lookup_node_to_hir (expr.get_mappings ().get_crate_num (),
- ref_node_id, &ref))
- {
- rust_error_at (expr.get_locus (), "reverse lookup failure");
- return;
- }
- if (scannedSymbols.find (ref) == scannedSymbols.end ())
- {
- worklist.push_back (ref);
- }
- liveSymbols.emplace (ref);
- }
-}
-
-void
-Liveness::visit (HIR::IdentifierExpr &expr)
-{
- NodeId ast_node_id = expr.get_mappings ().get_nodeid ();
-
- // then lookup the reference_node_id
- NodeId ref_node_id = UNKNOWN_NODEID;
- if (resolver->lookup_resolved_name (ast_node_id, &ref_node_id))
- {
- // these ref_node_ids will resolve to a pattern declaration but we are
- // interested in the definition that this refers to get the parent id
- Resolver::Definition def;
- if (!resolver->lookup_definition (ref_node_id, &def))
- {
- rust_error_at (expr.get_locus (),
- "unknown reference for resolved name");
- return;
- }
- ref_node_id = def.parent;
- }
-
- if (ref_node_id == UNKNOWN_NODEID)
- {
- rust_error_at (expr.get_locus (), "unresolved node: %s",
- expr.as_string ().c_str ());
- return;
- }
-
- // node back to HIR
- HirId ref;
- if (!mappings->lookup_node_to_hir (expr.get_mappings ().get_crate_num (),
- ref_node_id, &ref))
- {
- rust_error_at (expr.get_locus (), "reverse lookup failure");
- return;
- }
-
- if (scannedSymbols.find (ref) == scannedSymbols.end ())
- {
- worklist.push_back (ref);
- }
- liveSymbols.emplace (ref);
-}
-
-} // namespace Analysis
-} // namespace Rust
diff --git a/gcc/rust/analysis/rust-hir-liveness.h b/gcc/rust/analysis/rust-hir-liveness.h
deleted file mode 100644
index aa65991..0000000
--- a/gcc/rust/analysis/rust-hir-liveness.h
+++ /dev/null
@@ -1,153 +0,0 @@
-// Copyright (C) 2021 Free Software Foundation, Inc.
-
-// This file is part of GCC.
-
-// GCC is free software; you can redistribute it and/or modify it under
-// the terms of the GNU General Public License as published by the Free
-// Software Foundation; either version 3, or (at your option) any later
-// version.
-
-// GCC is distributed in the hope that it will be useful, but WITHOUT ANY
-// WARRANTY; without even the implied warranty of MERCHANTABILITY or
-// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-// for more details.
-
-// You should have received a copy of the GNU General Public License
-// along with GCC; see the file COPYING3. If not see
-// <http://www.gnu.org/licenses/>.
-
-#ifndef RUST_HIR_LIVENESS
-#define RUST_HIR_LIVENESS
-
-#include "rust-hir-full-decls.h"
-#include "rust-hir-map.h"
-#include "rust-hir-liveness-base.h"
-#include "rust-name-resolver.h"
-#include <set>
-
-namespace Rust {
-namespace Analysis {
-
-class Liveness : public LivenessBase
-{
- using Rust::Analysis::LivenessBase::visit;
-
-public:
- static std::set<HirId> Analysis (HIR::Crate &crate);
- void go (HIR::Crate &crate);
-
- void visit (HIR::PathInExpression &expr) override;
- void visit (HIR::IdentifierExpr &expr) override;
-
- void visit (HIR::BlockExpr &expr) override
- {
- expr.iterate_stmts ([&] (HIR::Stmt *s) mutable -> bool {
- s->accept_vis (*this);
- return true;
- });
- if (expr.has_expr ())
- {
- expr.get_final_expr ().get ()->accept_vis (*this);
- }
- }
- void visit (HIR::Function &function) override
- {
- function.get_definition ().get ()->accept_vis (*this);
- }
-
- void visit (HIR::ExprStmtWithoutBlock &stmt) override
- {
- stmt.get_expr ()->accept_vis (*this);
- }
-
- void visit (HIR::ExprStmtWithBlock &stmt) override
- {
- stmt.get_expr ()->accept_vis (*this);
- }
-
- void visit (HIR::CallExpr &expr) override
- {
- expr.get_fnexpr ()->accept_vis (*this);
- }
-
- void visit (HIR::ArithmeticOrLogicalExpr &expr) override
- {
- expr.visit_lhs (*this);
- expr.visit_rhs (*this);
- }
- void visit (HIR::ComparisonExpr &expr) override
- {
- expr.get_lhs ()->accept_vis (*this);
- expr.get_rhs ()->accept_vis (*this);
- }
- void visit (HIR::AssignmentExpr &expr) override
- {
- expr.visit_lhs (*this);
- expr.visit_rhs (*this);
- }
- void visit (HIR::Method &method) override
- {
- method.get_definition ().get ()->accept_vis (*this);
- }
- void visit (HIR::TraitItemFunc &item) override
- {
- item.get_block_expr ()->accept_vis (*this);
- }
- void visit (HIR::TraitItemMethod &item) override
- {
- item.get_block_expr ()->accept_vis (*this);
- }
- void visit (HIR::InherentImpl &impl) override
- {
- for (auto &&item : impl.get_impl_items ())
- {
- item.get ()->accept_vis (*this);
- }
- }
- void visit (HIR::TraitImpl &impl) override
- {
- for (auto &&item : impl.get_impl_items ())
- {
- item.get ()->accept_vis (*this);
- }
- }
- void visit (HIR::LetStmt &stmt) override
- {
- if (stmt.has_init_expr ())
- {
- stmt.get_init_expr ()->accept_vis (*this);
- }
- }
-
- void visit (HIR::StructExprStructFields &stct) override
- {
- stct.iterate ([&] (HIR::StructExprField *field) -> bool {
- field->accept_vis (*this);
- return true;
- });
- if (stct.has_struct_base ())
- {
- stct.struct_base->base_struct.get ()->accept_vis (*this);
- }
- }
-
- void visit (HIR::StructExprStructBase &stct) override
- {
- stct.get_struct_base ()->base_struct.get ()->accept_vis (*this);
- }
-
-private:
- std::vector<HirId> worklist;
- std::set<HirId> liveSymbols;
- std::set<HirId> scannedSymbols;
- Analysis::Mappings *mappings;
- Resolver::Resolver *resolver;
- Liveness (std::vector<HirId> worklist)
- : worklist (worklist), mappings (Analysis::Mappings::get ()),
- resolver (Resolver::Resolver::get ()){};
-};
-
-} // namespace Analysis
-} // namespace Rust
-
-#endif \ No newline at end of file
diff --git a/gcc/rust/analysis/rust-hir-scan-deadcode.h b/gcc/rust/analysis/rust-hir-scan-deadcode.h
deleted file mode 100644
index 4c42245..0000000
--- a/gcc/rust/analysis/rust-hir-scan-deadcode.h
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright (C) 2021 Free Software Foundation, Inc.
-
-// This file is part of GCC.
-
-// GCC is free software; you can redistribute it and/or modify it under
-// the terms of the GNU General Public License as published by the Free
-// Software Foundation; either version 3, or (at your option) any later
-// version.
-
-// GCC is distributed in the hope that it will be useful, but WITHOUT ANY
-// WARRANTY; without even the implied warranty of MERCHANTABILITY or
-// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-// for more details.
-
-// You should have received a copy of the GNU General Public License
-// along with GCC; see the file COPYING3. If not see
-// <http://www.gnu.org/licenses/>.
-
-#ifndef RUST_HIR_SCAN_DEADCODE
-#define RUST_HIR_SCAN_DEADCODE
-
-#include "rust-hir-full-decls.h"
-#include "rust-hir-map.h"
-#include "rust-hir-liveness-base.h"
-#include "rust-name-resolver.h"
-#include "rust-diagnostics.h"
-#include <set>
-
-namespace Rust {
-namespace Analysis {
-
-class ScanDeadcode : public LivenessBase
-{
- using Rust::Analysis::LivenessBase::visit;
-
-public:
- static void Scan (HIR::Crate &crate, std::set<HirId> live_symbols)
- {
- ScanDeadcode sdc (live_symbols);
- for (auto it = crate.items.begin (); it != crate.items.end (); it++)
- {
- it->get ()->accept_vis (sdc);
- }
- };
-
- void visit (HIR::Function &function) override
- {
- HirId hirId = function.get_mappings ().get_hirid ();
- if (live_symbols.find (hirId) == live_symbols.end ())
- {
- rust_warning_at (function.get_locus (), 0,
- "function is never used: `%s`",
- function.get_function_name ().c_str ());
- return;
- }
- }
-
-private:
- std::set<HirId> live_symbols;
- // std::set<HirId> dead_codes;
-
- ScanDeadcode (std::set<HirId> &live_symbols) : live_symbols (live_symbols){};
-};
-
-} // namespace Analysis
-} // namespace Rust
-
-#endif \ No newline at end of file