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 18 namespace llvm { 19 namespace objcopy { 20 namespace coff { 21 22 struct Object; 23 24 class 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 51 public: ~COFFWriter()52 virtual ~COFFWriter() {} 53 Error write(); 54 COFFWriter(Object & Obj,raw_ostream & Out)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