]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm-project/lld/include/lld/Core/Node.h
Merge ^/head r357408 through r357661.
[FreeBSD/FreeBSD.git] / contrib / llvm-project / lld / include / lld / Core / Node.h
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
31   explicit Node(Kind type) : _kind(type) {}
32   virtual ~Node() = default;
33
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:
44   explicit GroupEnd(int size) : Node(Kind::GroupEnd), _size(size) {}
45
46   int getSize() const { return _size; }
47
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:
59   explicit FileNode(std::unique_ptr<File> f)
60       : Node(Node::Kind::File), _file(std::move(f)) {}
61
62   static bool classof(const Node *a) {
63     return a->kind() == Node::Kind::File;
64   }
65
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