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 76