This flag is implemented similarly to --reproduce in the ELF linker. This patch implements /linkrepro by moving the cpio writer and associated utility functions to lldCore, and using that implementation in both linkers. One COFF-specific detail is that we store the object file from which the resource files were created in our reproducer, rather than the resource files themselves. This allows the reproducer to be used on non-Windows systems for example. Differential Revision: https://reviews.llvm.org/D22418 llvm-svn: 276719
85 lines
2.3 KiB
C++
85 lines
2.3 KiB
C++
//===- Driver.h -------------------------------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Linker
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLD_ELF_DRIVER_H
|
|
#define LLD_ELF_DRIVER_H
|
|
|
|
#include "SymbolTable.h"
|
|
#include "lld/Core/LLVM.h"
|
|
#include "lld/Core/Reproduce.h"
|
|
#include "llvm/ADT/Optional.h"
|
|
#include "llvm/ADT/StringRef.h"
|
|
#include "llvm/ADT/StringSet.h"
|
|
#include "llvm/Option/ArgList.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
|
|
namespace lld {
|
|
namespace elf {
|
|
|
|
extern class LinkerDriver *Driver;
|
|
|
|
class LinkerDriver {
|
|
public:
|
|
void main(ArrayRef<const char *> Args);
|
|
void addFile(StringRef Path);
|
|
void addLibrary(StringRef Name);
|
|
llvm::LLVMContext Context; // to parse bitcode ifles
|
|
std::unique_ptr<CpioFile> Cpio; // for reproduce
|
|
|
|
private:
|
|
std::vector<MemoryBufferRef> getArchiveMembers(MemoryBufferRef MB);
|
|
llvm::Optional<MemoryBufferRef> readFile(StringRef Path);
|
|
void readConfigs(llvm::opt::InputArgList &Args);
|
|
void createFiles(llvm::opt::InputArgList &Args);
|
|
template <class ELFT> void link(llvm::opt::InputArgList &Args);
|
|
|
|
// True if we are in --whole-archive and --no-whole-archive.
|
|
bool WholeArchive = false;
|
|
|
|
// True if we are in --start-lib and --end-lib.
|
|
bool InLib = false;
|
|
|
|
llvm::BumpPtrAllocator Alloc;
|
|
std::vector<std::unique_ptr<InputFile>> Files;
|
|
std::vector<std::unique_ptr<MemoryBuffer>> OwningMBs;
|
|
};
|
|
|
|
// Parses command line options.
|
|
class ELFOptTable : public llvm::opt::OptTable {
|
|
public:
|
|
ELFOptTable();
|
|
llvm::opt::InputArgList parse(ArrayRef<const char *> Argv);
|
|
|
|
private:
|
|
llvm::BumpPtrAllocator Alloc;
|
|
};
|
|
|
|
// Create enum with OPT_xxx values for each option in Options.td
|
|
enum {
|
|
OPT_INVALID = 0,
|
|
#define OPTION(_1, _2, ID, _4, _5, _6, _7, _8, _9, _10, _11) OPT_##ID,
|
|
#include "Options.inc"
|
|
#undef OPTION
|
|
};
|
|
|
|
void printHelp(const char *Argv0);
|
|
std::string getVersionString();
|
|
std::vector<uint8_t> parseHexstring(StringRef S);
|
|
|
|
std::string createResponseFile(const llvm::opt::InputArgList &Args);
|
|
|
|
std::string findFromSearchPaths(StringRef Path);
|
|
std::string searchLibrary(StringRef Path);
|
|
std::string buildSysrootedPath(llvm::StringRef Dir, llvm::StringRef File);
|
|
|
|
} // namespace elf
|
|
} // namespace lld
|
|
|
|
#endif
|