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