Files
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

120 lines
3.8 KiB
C++

//===-- XtensaTargetStreamer.cpp - Xtensa Target Streamer Methods ---------===//
//
// 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
//
//===----------------------------------------------------------------------===//
//
// This file provides Xtensa specific target streamer methods.
//
//===----------------------------------------------------------------------===//
#include "XtensaTargetStreamer.h"
#include "XtensaInstPrinter.h"
#include "llvm/BinaryFormat/ELF.h"
#include "llvm/MC/MCAssembler.h"
#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCObjectFileInfo.h"
#include "llvm/MC/MCSectionELF.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/FormattedStream.h"
using namespace llvm;
static std::string getLiteralSectionName(StringRef CSectionName) {
std::size_t Pos = CSectionName.find(".text");
std::string SectionName;
if (Pos != std::string::npos) {
SectionName = CSectionName.substr(0, Pos);
if (Pos > 0)
SectionName += ".text";
CSectionName = CSectionName.drop_front(Pos);
CSectionName.consume_front(".text");
SectionName += ".literal";
SectionName += CSectionName;
} else {
SectionName = CSectionName;
SectionName += ".literal";
}
return SectionName;
}
XtensaTargetStreamer::XtensaTargetStreamer(MCStreamer &S)
: MCTargetStreamer(S) {}
XtensaTargetAsmStreamer::XtensaTargetAsmStreamer(MCStreamer &S,
formatted_raw_ostream &OS)
: XtensaTargetStreamer(S), OS(OS) {}
void XtensaTargetAsmStreamer::emitLiteral(MCSymbol *LblSym, const MCExpr *Value,
bool SwitchLiteralSection, SMLoc L) {
SmallString<60> Str;
raw_svector_ostream LiteralStr(Str);
LiteralStr << "\t.literal " << LblSym->getName() << ", ";
if (auto CE = dyn_cast<MCConstantExpr>(Value)) {
LiteralStr << CE->getValue() << "\n";
} else if (auto SRE = dyn_cast<MCSymbolRefExpr>(Value)) {
const MCSymbol &Sym = SRE->getSymbol();
LiteralStr << Sym.getName() << "\n";
} else {
llvm_unreachable("unexpected constant pool entry type");
}
OS << LiteralStr.str();
}
void XtensaTargetAsmStreamer::emitLiteralPosition() {
OS << "\t.literal_position\n";
}
void XtensaTargetAsmStreamer::startLiteralSection(MCSection *BaseSection) {
emitLiteralPosition();
}
XtensaTargetELFStreamer::XtensaTargetELFStreamer(MCStreamer &S)
: XtensaTargetStreamer(S) {}
void XtensaTargetELFStreamer::emitLiteral(MCSymbol *LblSym, const MCExpr *Value,
bool SwitchLiteralSection, SMLoc L) {
MCStreamer &OutStreamer = getStreamer();
if (SwitchLiteralSection) {
MCContext &Context = OutStreamer.getContext();
auto *CS = static_cast<MCSectionELF *>(OutStreamer.getCurrentSectionOnly());
std::string SectionName = getLiteralSectionName(CS->getName());
MCSection *ConstSection = Context.getELFSection(
SectionName, ELF::SHT_PROGBITS, ELF::SHF_EXECINSTR | ELF::SHF_ALLOC);
OutStreamer.pushSection();
OutStreamer.switchSection(ConstSection);
}
OutStreamer.emitLabel(LblSym, L);
OutStreamer.emitValue(Value, 4, L);
if (SwitchLiteralSection) {
OutStreamer.popSection();
}
}
void XtensaTargetELFStreamer::startLiteralSection(MCSection *BaseSection) {
MCContext &Context = getStreamer().getContext();
std::string SectionName = getLiteralSectionName(BaseSection->getName());
MCSection *ConstSection = Context.getELFSection(
SectionName, ELF::SHT_PROGBITS, ELF::SHF_EXECINSTR | ELF::SHF_ALLOC);
ConstSection->setAlignment(Align(4));
}
MCELFStreamer &XtensaTargetELFStreamer::getStreamer() {
return static_cast<MCELFStreamer &>(Streamer);
}