File indexing completed on 2026-05-10 08:44:14
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef LLVM_MC_MCOBJECTWRITER_H
0010 #define LLVM_MC_MCOBJECTWRITER_H
0011
0012 #include "llvm/MC/MCSymbol.h"
0013 #include "llvm/TargetParser/Triple.h"
0014 #include <cstdint>
0015
0016 namespace llvm {
0017
0018 class MCAssembler;
0019 class MCFixup;
0020 class MCFragment;
0021 class MCSymbol;
0022 class MCSymbolRefExpr;
0023 class MCValue;
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033 class MCObjectWriter {
0034 protected:
0035
0036 SmallVector<std::pair<std::string, size_t>, 0> FileNames;
0037
0038 std::string CompilerVersion;
0039 std::vector<const MCSymbol *> AddrsigSyms;
0040 bool EmitAddrsigSection = false;
0041 bool SubsectionsViaSymbols = false;
0042
0043 struct CGProfileEntry {
0044 const MCSymbolRefExpr *From;
0045 const MCSymbolRefExpr *To;
0046 uint64_t Count;
0047 };
0048 SmallVector<CGProfileEntry, 0> CGProfile;
0049
0050 MCObjectWriter() = default;
0051
0052 public:
0053 MCObjectWriter(const MCObjectWriter &) = delete;
0054 MCObjectWriter &operator=(const MCObjectWriter &) = delete;
0055 virtual ~MCObjectWriter();
0056
0057
0058 virtual void reset();
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068 virtual void executePostLayoutBinding(MCAssembler &Asm) {}
0069
0070
0071
0072
0073
0074
0075
0076 virtual void recordRelocation(MCAssembler &Asm, const MCFragment *Fragment,
0077 const MCFixup &Fixup, MCValue Target,
0078 uint64_t &FixedValue) = 0;
0079
0080
0081
0082
0083
0084
0085 bool isSymbolRefDifferenceFullyResolved(const MCAssembler &Asm,
0086 const MCSymbolRefExpr *A,
0087 const MCSymbolRefExpr *B,
0088 bool InSet) const;
0089
0090 virtual bool isSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm,
0091 const MCSymbol &SymA,
0092 const MCFragment &FB,
0093 bool InSet,
0094 bool IsPCRel) const;
0095
0096 MutableArrayRef<std::pair<std::string, size_t>> getFileNames() {
0097 return FileNames;
0098 }
0099 void addFileName(MCAssembler &Asm, StringRef FileName);
0100 void setCompilerVersion(StringRef CompilerVers) {
0101 CompilerVersion = CompilerVers;
0102 }
0103
0104
0105
0106
0107 void emitAddrsigSection() { EmitAddrsigSection = true; }
0108
0109 bool getEmitAddrsigSection() { return EmitAddrsigSection; }
0110
0111
0112
0113 void addAddrsigSymbol(const MCSymbol *Sym) { AddrsigSyms.push_back(Sym); }
0114
0115 std::vector<const MCSymbol *> &getAddrsigSyms() { return AddrsigSyms; }
0116 SmallVector<CGProfileEntry, 0> &getCGProfile() { return CGProfile; }
0117
0118
0119 bool getSubsectionsViaSymbols() const { return SubsectionsViaSymbols; }
0120 void setSubsectionsViaSymbols(bool Value) { SubsectionsViaSymbols = Value; }
0121
0122
0123
0124
0125
0126
0127 virtual uint64_t writeObject(MCAssembler &Asm) = 0;
0128
0129
0130 };
0131
0132
0133
0134 class MCObjectTargetWriter {
0135 public:
0136 virtual ~MCObjectTargetWriter() = default;
0137 virtual Triple::ObjectFormatType getFormat() const = 0;
0138 };
0139
0140 }
0141
0142 #endif