Nyxstone
Loading...
Searching...
No Matches
ObjectWriterWrapper.h
1#pragma once
2
3#include "nyxstone.h"
4
5#include <llvm/Config/llvm-config.h>
6
7#include <llvm/MC/MCAsmBackend.h>
8#include <llvm/MC/MCAsmLayout.h>
9#include <llvm/MC/MCAssembler.h>
10#include <llvm/MC/MCContext.h>
11#include <llvm/MC/MCExpr.h>
12#include <llvm/MC/MCFixup.h>
13#include <llvm/MC/MCFixupKindInfo.h>
14#include <llvm/MC/MCFragment.h>
15#include <llvm/MC/MCObjectWriter.h>
16#include <llvm/MC/MCSection.h>
17#include <llvm/MC/MCSymbol.h>
18#include <llvm/MC/MCValue.h>
19
20namespace nyxstone {
29class ObjectWriterWrapper : public llvm::MCObjectWriter {
30 // Wrapped MCObjectWriter, f. i., ELFSingleObjectWriter
31 std::unique_ptr<llvm::MCObjectWriter> inner_object_writer;
32
34 llvm::raw_pwrite_stream& stream;
35
37 llvm::MCContext& context;
38
40 bool write_text_section_only;
41
43 u64 start_address;
44
46 std::string& extended_error;
47
49 std::vector<Nyxstone::Instruction>* instructions;
50
58 void validate_fixups(const llvm::MCFragment& fragment, const llvm::MCAsmLayout& Layout);
59
60public:
73 ObjectWriterWrapper(std::unique_ptr<llvm::MCObjectWriter>&& object_writer, llvm::raw_pwrite_stream& stream,
74 llvm::MCContext& context, bool write_text_section_only, u64 start_address, std::string& extended_error,
75 std::vector<Nyxstone::Instruction>* instructions)
76 : inner_object_writer(std::move(object_writer))
77 , stream(stream)
78 , context(context)
79 , write_text_section_only(write_text_section_only)
80 , start_address(start_address)
81 , extended_error(extended_error)
82 , instructions(instructions)
83 {
84 }
85
95 static std::unique_ptr<llvm::MCObjectWriter> createObjectWriterWrapper(
96 std::unique_ptr<llvm::MCObjectWriter>&& object_writer, llvm::raw_pwrite_stream& stream,
97 llvm::MCContext& context, bool write_text_section_only, u64 start_address, std::string& extended_error,
98 std::vector<Nyxstone::Instruction>* instructions);
99
101 void executePostLayoutBinding(llvm::MCAssembler& Asm, const llvm::MCAsmLayout& Layout) override;
102
107 bool resolve_relocation(llvm::MCAssembler& assembler, const llvm::MCAsmLayout& layout,
108 const llvm::MCFragment* fragment, const llvm::MCFixup& fixup, llvm::MCValue target, uint64_t& fixed_value);
109
125 void recordRelocation(llvm::MCAssembler& Asm, const llvm::MCAsmLayout& Layout, const llvm::MCFragment* Fragment,
126 const llvm::MCFixup& Fixup, llvm::MCValue Target, uint64_t& FixedValue) override;
127
129 uint64_t writeObject(llvm::MCAssembler& Asm, const llvm::MCAsmLayout& Layout) override;
130};
131} // namespace nyxstone
Definition ObjectWriterWrapper.h:29
static std::unique_ptr< llvm::MCObjectWriter > createObjectWriterWrapper(std::unique_ptr< llvm::MCObjectWriter > &&object_writer, llvm::raw_pwrite_stream &stream, llvm::MCContext &context, bool write_text_section_only, u64 start_address, std::string &extended_error, std::vector< Nyxstone::Instruction > *instructions)
Creates a UniquePtr holding the the ObjectWriterWrapper.
Definition ObjectWriterWrapper.cpp:325
void recordRelocation(llvm::MCAssembler &Asm, const llvm::MCAsmLayout &Layout, const llvm::MCFragment *Fragment, const llvm::MCFixup &Fixup, llvm::MCValue Target, uint64_t &FixedValue) override
Tries to resolve relocations (that are normally resolved at link time) instead of recording them.
Definition ObjectWriterWrapper.cpp:205
bool resolve_relocation(llvm::MCAssembler &assembler, const llvm::MCAsmLayout &layout, const llvm::MCFragment *fragment, const llvm::MCFixup &fixup, llvm::MCValue target, uint64_t &fixed_value)
Internal resolve for relocations.
Definition ObjectWriterWrapper.cpp:159
uint64_t writeObject(llvm::MCAssembler &Asm, const llvm::MCAsmLayout &Layout) override
Write object to the stream and update the bytes of the instruction details.
Definition ObjectWriterWrapper.cpp:231
ObjectWriterWrapper(std::unique_ptr< llvm::MCObjectWriter > &&object_writer, llvm::raw_pwrite_stream &stream, llvm::MCContext &context, bool write_text_section_only, u64 start_address, std::string &extended_error, std::vector< Nyxstone::Instruction > *instructions)
Creates an ObjectWriterWrapper.
Definition ObjectWriterWrapper.h:73
void executePostLayoutBinding(llvm::MCAssembler &Asm, const llvm::MCAsmLayout &Layout) override
Simple function wrapper calling the wrapped object wrapper function directly.
Definition ObjectWriterWrapper.cpp:154