We can move all not templated functionality to LinkerScriptBase. Patch do that for hasPhdrsCommands() and shows how it helps to detemplate things in other places. Probably we should be able to merge these 2 classes into single one after such steps. Even if not, it still looks as reasonable cleanup for me. Differential revision: https://reviews.llvm.org/D30895 llvm-svn: 297714
65 lines
1.7 KiB
C++
65 lines
1.7 KiB
C++
//===- Writer.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_WRITER_H
|
|
#define LLD_ELF_WRITER_H
|
|
|
|
#include "llvm/ADT/ArrayRef.h"
|
|
#include "llvm/ADT/StringRef.h"
|
|
#include <cstdint>
|
|
#include <memory>
|
|
|
|
namespace lld {
|
|
namespace elf {
|
|
class InputFile;
|
|
class OutputSection;
|
|
class InputSectionBase;
|
|
template <class ELFT> class ObjectFile;
|
|
template <class ELFT> class SymbolTable;
|
|
template <class ELFT> void writeResult();
|
|
template <class ELFT> void markLive();
|
|
template <class ELFT> bool isRelroSection(const OutputSection *Sec);
|
|
|
|
// This describes a program header entry.
|
|
// Each contains type, access flags and range of output sections that will be
|
|
// placed in it.
|
|
struct PhdrEntry {
|
|
PhdrEntry(unsigned Type, unsigned Flags);
|
|
void add(OutputSection *Sec);
|
|
|
|
uint64_t p_paddr = 0;
|
|
uint64_t p_vaddr = 0;
|
|
uint64_t p_memsz = 0;
|
|
uint64_t p_filesz = 0;
|
|
uint64_t p_offset = 0;
|
|
uint32_t p_align = 0;
|
|
uint32_t p_type = 0;
|
|
uint32_t p_flags = 0;
|
|
|
|
OutputSection *First = nullptr;
|
|
OutputSection *Last = nullptr;
|
|
bool HasLMA = false;
|
|
};
|
|
|
|
llvm::StringRef getOutputSectionName(llvm::StringRef Name);
|
|
|
|
bool allocateHeaders(std::vector<PhdrEntry> &, llvm::ArrayRef<OutputSection *>,
|
|
uint64_t Min);
|
|
|
|
template <class ELFT> uint32_t getMipsEFlags();
|
|
|
|
uint8_t getMipsFpAbiFlag(uint8_t OldFlag, uint8_t NewFlag,
|
|
llvm::StringRef FileName);
|
|
|
|
bool isMipsN32Abi(const InputFile *F);
|
|
}
|
|
}
|
|
|
|
#endif
|