diff options
author | Thomas Young <wenzhang5800@gmail.com> | 2021-06-15 10:26:49 +0800 |
---|---|---|
committer | Thomas Young <wenzhang5800@gmail.com> | 2021-06-15 10:26:49 +0800 |
commit | ba9728b401879691c81b8315e97f82a7c72826c8 (patch) | |
tree | edd550ab7d6d3c26c36603c8861d4e758649e4d4 /gcc/rust/analysis | |
parent | 59f8d7a2343cd326e905be618c820387cf13afb7 (diff) | |
download | gcc-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.h | 208 | ||||
-rw-r--r-- | gcc/rust/analysis/rust-hir-liveness.cc | 166 | ||||
-rw-r--r-- | gcc/rust/analysis/rust-hir-liveness.h | 153 | ||||
-rw-r--r-- | gcc/rust/analysis/rust-hir-scan-deadcode.h | 68 |
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 |