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