PositionalOptions.h revision 533eae20118036f425f27bf0536ef0ccbb090b65
1//===- PositionalOptions.h ------------------------------------------------===// 2// 3// The MCLinker Project 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9#ifndef MCLD_LDLITE_POSITIONAL_OPTIONS_H 10#define MCLD_LDLITE_POSITIONAL_OPTIONS_H 11#include <llvm/Support/CommandLine.h> 12#include <mcld/Support/CommandLine.h> 13#include <mcld/Support/Path.h> 14#include <string> 15 16namespace mcld { 17 18class InputAction; 19class LinkerConfig; 20class LinkerScript; 21 22/** \class PositionalOptions 23 * 24 * The meaning of a positional option depends on its position and its related 25 * positions with the other positional options. There are four kinds of 26 * positional options: 27 * 1. Inputs, object files, such as /tmp/XXXX.o 28 * 2. Namespecs, short names of libraries. A namespec may refer to an archive 29 * or a shared library. For example, -lm. 30 * 3. Attributes of inputs. Attributes describe inputs appears after them. 31 * For example, --as-needed and --whole-archive. 32 * 4. Groups. A Group is a set of archives. Linkers repeatedly read archives 33 * in groups until there is no new undefined symbols. 34 * 5. Definitions of symbols. --defsym option depends on 35 */ 36class PositionalOptions 37{ 38public: 39 PositionalOptions(); 40 41 size_t numOfInputs() const; 42 43 bool parse(std::vector<InputAction*>& pActions, 44 const LinkerConfig& pConfig, 45 const LinkerScript& pScript); 46 47private: 48 size_t numOfActions() const; 49 50private: 51 llvm::cl::list<mcld::sys::fs::Path>& m_InputObjectFiles; 52 llvm::cl::list<std::string>& m_LinkerScript; 53 llvm::cl::list<std::string>& m_NameSpecList; 54 llvm::cl::list<bool>& m_WholeArchiveList; 55 llvm::cl::list<bool>& m_NoWholeArchiveList; 56 llvm::cl::list<bool>& m_AsNeededList; 57 llvm::cl::list<bool>& m_NoAsNeededList; 58 llvm::cl::list<bool>& m_AddNeededList; 59 llvm::cl::list<bool>& m_NoAddNeededList; 60 llvm::cl::list<bool>& m_BDynamicList; 61 llvm::cl::list<bool>& m_BStaticList; 62 llvm::cl::list<bool>& m_StartGroupList; 63 llvm::cl::list<bool>& m_EndGroupList; 64 llvm::cl::list<std::string>& m_DefSymList; 65 66}; 67 68} // namespace of mcld 69 70#endif 71 72