• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- lld/Core/Node.h - Input file class -----------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 ///
9 /// \file
10 ///
11 /// The classes in this file represents inputs to the linker.
12 ///
13 //===----------------------------------------------------------------------===//
14 
15 #ifndef LLD_CORE_NODE_H
16 #define LLD_CORE_NODE_H
17 
18 #include "lld/Core/File.h"
19 #include <algorithm>
20 #include <memory>
21 
22 namespace lld {
23 
24 // A Node represents a FileNode or other type of Node. In the latter case,
25 // the node contains meta information about the input file list.
26 // Currently only GroupEnd node is defined as a meta node.
27 class Node {
28 public:
29   enum class Kind { File, GroupEnd };
30 
Node(Kind type)31   explicit Node(Kind type) : _kind(type) {}
32   virtual ~Node() = default;
33 
kind()34   virtual Kind kind() const { return _kind; }
35 
36 private:
37   Kind _kind;
38 };
39 
40 // This is a marker for --end-group. getSize() returns the number of
41 // files between the corresponding --start-group and this marker.
42 class GroupEnd : public Node {
43 public:
GroupEnd(int size)44   explicit GroupEnd(int size) : Node(Kind::GroupEnd), _size(size) {}
45 
getSize()46   int getSize() const { return _size; }
47 
classof(const Node * a)48   static bool classof(const Node *a) {
49     return a->kind() == Kind::GroupEnd;
50   }
51 
52 private:
53   int _size;
54 };
55 
56 // A container of File.
57 class FileNode : public Node {
58 public:
FileNode(std::unique_ptr<File> f)59   explicit FileNode(std::unique_ptr<File> f)
60       : Node(Node::Kind::File), _file(std::move(f)) {}
61 
classof(const Node * a)62   static bool classof(const Node *a) {
63     return a->kind() == Node::Kind::File;
64   }
65 
getFile()66   File *getFile() { return _file.get(); }
67 
68 protected:
69   std::unique_ptr<File> _file;
70 };
71 
72 } // end namespace lld
73 
74 #endif // LLD_CORE_NODE_H
75