Files
gps/tools/local/circt/include/llvm/MC/MCDXContainerWriter.h
T
2026-07-12 11:01:51 +03:00

88 lines
2.5 KiB
C++

//===- llvm/MC/MCDXContainerWriter.h - DXContainer Writer -*- 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_MCDXCONTAINERWRITER_H
#define LLVM_MC_MCDXCONTAINERWRITER_H
#include "llvm/MC/MCObjectWriter.h"
#include "llvm/MC/MCValue.h"
#include "llvm/Support/EndianStream.h"
#include "llvm/TargetParser/Triple.h"
namespace llvm {
class raw_pwrite_stream;
class LLVM_ABI MCDXContainerTargetWriter : public MCObjectTargetWriter {
protected:
MCDXContainerTargetWriter() {}
public:
~MCDXContainerTargetWriter() override;
Triple::ObjectFormatType getFormat() const override {
return Triple::DXContainer;
}
static bool classof(const MCObjectTargetWriter *W) {
return W->getFormat() == Triple::DXContainer;
}
};
/// Contains PDB output file name.
static constexpr StringLiteral PdbFileNameSectionName = "PDBNAME";
/// Contains module hash.
static constexpr StringLiteral ModuleHashSectionName = "PDBHASH";
struct MCDXContainerPart {
StringRef Name;
StringRef Data;
};
class LLVM_ABI MCDXContainerBaseWriter {
protected:
virtual ArrayRef<MCDXContainerPart> collectParts() {
llvm_unreachable("Unimplemented");
}
virtual bool shouldSkipSection(StringRef SectionName, size_t SectionSize) {
// Skip empty and auxiliary sections.
return SectionSize == 0 || SectionName == PdbFileNameSectionName ||
SectionName == ModuleHashSectionName;
}
public:
MCDXContainerBaseWriter() {}
virtual ~MCDXContainerBaseWriter();
void write(raw_ostream &OS, const Triple &TT);
};
class LLVM_ABI DXContainerObjectWriter final : public MCDXContainerBaseWriter,
public MCObjectWriter {
support::endian::Writer W;
std::unique_ptr<MCDXContainerTargetWriter> TargetObjectWriter;
SmallVector<MCDXContainerPart> Parts;
SmallVector<SmallString<0>> SectionBuffers;
void clearParts();
protected:
ArrayRef<MCDXContainerPart> collectParts() override;
public:
DXContainerObjectWriter(std::unique_ptr<MCDXContainerTargetWriter> MOTW,
raw_pwrite_stream &OS)
: W(OS, llvm::endianness::little), TargetObjectWriter(std::move(MOTW)) {}
uint64_t writeObject() override;
};
} // end namespace llvm
#endif // LLVM_MC_MCDXCONTAINERWRITER_H