123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===- llvm/MC/MCObjectWriter.h - Object File Writer Interface --*- C++ -*-===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_MC_MCOBJECTWRITER_H
- #define LLVM_MC_MCOBJECTWRITER_H
- #include "llvm/ADT/Triple.h"
- #include <cstdint>
- namespace llvm {
- class MCAsmLayout;
- class MCAssembler;
- class MCFixup;
- class MCFragment;
- class MCSymbol;
- class MCSymbolRefExpr;
- class MCValue;
- /// Defines the object file and target independent interfaces used by the
- /// assembler backend to write native file format object files.
- ///
- /// The object writer contains a few callbacks used by the assembler to allow
- /// the object writer to modify the assembler data structures at appropriate
- /// points. Once assembly is complete, the object writer is given the
- /// MCAssembler instance, which contains all the symbol and section data which
- /// should be emitted as part of writeObject().
- class MCObjectWriter {
- protected:
- MCObjectWriter() = default;
- public:
- MCObjectWriter(const MCObjectWriter &) = delete;
- MCObjectWriter &operator=(const MCObjectWriter &) = delete;
- virtual ~MCObjectWriter();
- /// lifetime management
- virtual void reset() {}
- /// \name High-Level API
- /// @{
- /// Perform any late binding of symbols (for example, to assign symbol
- /// indices for use when generating relocations).
- ///
- /// This routine is called by the assembler after layout and relaxation is
- /// complete.
- virtual void executePostLayoutBinding(MCAssembler &Asm,
- const MCAsmLayout &Layout) = 0;
- /// Record a relocation entry.
- ///
- /// This routine is called by the assembler after layout and relaxation, and
- /// post layout binding. The implementation is responsible for storing
- /// information about the relocation so that it can be emitted during
- /// writeObject().
- virtual void recordRelocation(MCAssembler &Asm, const MCAsmLayout &Layout,
- const MCFragment *Fragment,
- const MCFixup &Fixup, MCValue Target,
- uint64_t &FixedValue) = 0;
- /// Check whether the difference (A - B) between two symbol references is
- /// fully resolved.
- ///
- /// Clients are not required to answer precisely and may conservatively return
- /// false, even when a difference is fully resolved.
- bool isSymbolRefDifferenceFullyResolved(const MCAssembler &Asm,
- const MCSymbolRefExpr *A,
- const MCSymbolRefExpr *B,
- bool InSet) const;
- virtual bool isSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm,
- const MCSymbol &A,
- const MCSymbol &B,
- bool InSet) const;
- virtual bool isSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm,
- const MCSymbol &SymA,
- const MCFragment &FB,
- bool InSet,
- bool IsPCRel) const;
- /// ELF only. Mark that we have seen GNU ABI usage (e.g. SHF_GNU_RETAIN).
- virtual void markGnuAbi() {}
- /// Tell the object writer to emit an address-significance table during
- /// writeObject(). If this function is not called, all symbols are treated as
- /// address-significant.
- virtual void emitAddrsigSection() {}
- /// Record the given symbol in the address-significance table to be written
- /// diring writeObject().
- virtual void addAddrsigSymbol(const MCSymbol *Sym) {}
- /// Write the object file and returns the number of bytes written.
- ///
- /// This routine is called by the assembler after layout and relaxation is
- /// complete, fixups have been evaluated and applied, and relocations
- /// generated.
- virtual uint64_t writeObject(MCAssembler &Asm, const MCAsmLayout &Layout) = 0;
- /// @}
- };
- /// Base class for classes that define behaviour that is specific to both the
- /// target and the object format.
- class MCObjectTargetWriter {
- public:
- virtual ~MCObjectTargetWriter() = default;
- virtual Triple::ObjectFormatType getFormat() const = 0;
- };
- } // end namespace llvm
- #endif // LLVM_MC_MCOBJECTWRITER_H
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|