1//===- COFFWriter.h ---------------------------------------------*- 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#ifndef LLVM_LIB_OBJCOPY_COFF_COFFWRITER_H 10#define LLVM_LIB_OBJCOPY_COFF_COFFWRITER_H 11 12#include "llvm/MC/StringTableBuilder.h" 13#include "llvm/Support/Error.h" 14#include "llvm/Support/MemoryBuffer.h" 15#include <cstddef> 16#include <utility> 17 18namespace llvm { 19namespace objcopy { 20namespace coff { 21 22struct Object; 23 24class COFFWriter { 25 Object &Obj; 26 std::unique_ptr<WritableMemoryBuffer> Buf; 27 raw_ostream &Out; 28 29 size_t FileSize; 30 size_t FileAlignment; 31 size_t SizeOfInitializedData; 32 StringTableBuilder StrTabBuilder; 33 34 template <class SymbolTy> std::pair<size_t, size_t> finalizeSymbolTable(); 35 Error finalizeRelocTargets(); 36 Error finalizeSymbolContents(); 37 void layoutSections(); 38 Expected<size_t> finalizeStringTable(); 39 40 Error finalize(bool IsBigObj); 41 42 void writeHeaders(bool IsBigObj); 43 void writeSections(); 44 template <class SymbolTy> void writeSymbolStringTables(); 45 46 Error write(bool IsBigObj); 47 48 Error patchDebugDirectory(); 49 Expected<uint32_t> virtualAddressToFileAddress(uint32_t RVA); 50 51public: 52 virtual ~COFFWriter() {} 53 Error write(); 54 55 COFFWriter(Object &Obj, raw_ostream &Out) 56 : Obj(Obj), Out(Out), StrTabBuilder(StringTableBuilder::WinCOFF) {} 57}; 58 59} // end namespace coff 60} // end namespace objcopy 61} // end namespace llvm 62 63#endif // LLVM_LIB_OBJCOPY_COFF_COFFWRITER_H 64