Path: blob/main/contrib/llvm-project/llvm/lib/Target/RISCV/MCTargetDesc/RISCVTargetStreamer.cpp
35294 views
//===-- RISCVTargetStreamer.cpp - RISC-V Target Streamer Methods ----------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file provides RISC-V specific target streamer methods.9//10//===----------------------------------------------------------------------===//1112#include "RISCVTargetStreamer.h"13#include "RISCVBaseInfo.h"14#include "RISCVMCTargetDesc.h"15#include "llvm/MC/MCSymbol.h"16#include "llvm/Support/CommandLine.h"17#include "llvm/Support/FormattedStream.h"18#include "llvm/Support/RISCVAttributes.h"19#include "llvm/TargetParser/RISCVISAInfo.h"2021using namespace llvm;2223// This option controls wether or not we emit ELF attributes for ABI features,24// like RISC-V atomics or X3 usage.25static cl::opt<bool> RiscvAbiAttr(26"riscv-abi-attributes",27cl::desc("Enable emitting RISC-V ELF attributes for ABI features"),28cl::Hidden);2930RISCVTargetStreamer::RISCVTargetStreamer(MCStreamer &S) : MCTargetStreamer(S) {}3132void RISCVTargetStreamer::finish() { finishAttributeSection(); }33void RISCVTargetStreamer::reset() {}3435void RISCVTargetStreamer::emitDirectiveOptionPush() {}36void RISCVTargetStreamer::emitDirectiveOptionPop() {}37void RISCVTargetStreamer::emitDirectiveOptionPIC() {}38void RISCVTargetStreamer::emitDirectiveOptionNoPIC() {}39void RISCVTargetStreamer::emitDirectiveOptionRVC() {}40void RISCVTargetStreamer::emitDirectiveOptionNoRVC() {}41void RISCVTargetStreamer::emitDirectiveOptionRelax() {}42void RISCVTargetStreamer::emitDirectiveOptionNoRelax() {}43void RISCVTargetStreamer::emitDirectiveOptionArch(44ArrayRef<RISCVOptionArchArg> Args) {}45void RISCVTargetStreamer::emitDirectiveVariantCC(MCSymbol &Symbol) {}46void RISCVTargetStreamer::emitAttribute(unsigned Attribute, unsigned Value) {}47void RISCVTargetStreamer::finishAttributeSection() {}48void RISCVTargetStreamer::emitTextAttribute(unsigned Attribute,49StringRef String) {}50void RISCVTargetStreamer::emitIntTextAttribute(unsigned Attribute,51unsigned IntValue,52StringRef StringValue) {}53void RISCVTargetStreamer::setTargetABI(RISCVABI::ABI ABI) {54assert(ABI != RISCVABI::ABI_Unknown && "Improperly initialized target ABI");55TargetABI = ABI;56}5758void RISCVTargetStreamer::setFlagsFromFeatures(const MCSubtargetInfo &STI) {59HasRVC = STI.hasFeature(RISCV::FeatureStdExtC) ||60STI.hasFeature(RISCV::FeatureStdExtZca);61HasTSO = STI.hasFeature(RISCV::FeatureStdExtZtso);62}6364void RISCVTargetStreamer::emitTargetAttributes(const MCSubtargetInfo &STI,65bool EmitStackAlign) {66if (EmitStackAlign) {67unsigned StackAlign;68if (TargetABI == RISCVABI::ABI_ILP32E)69StackAlign = 4;70else if (TargetABI == RISCVABI::ABI_LP64E)71StackAlign = 8;72else73StackAlign = 16;74emitAttribute(RISCVAttrs::STACK_ALIGN, StackAlign);75}7677auto ParseResult = RISCVFeatures::parseFeatureBits(78STI.hasFeature(RISCV::Feature64Bit), STI.getFeatureBits());79if (!ParseResult) {80report_fatal_error(ParseResult.takeError());81} else {82auto &ISAInfo = *ParseResult;83emitTextAttribute(RISCVAttrs::ARCH, ISAInfo->toString());84}8586if (RiscvAbiAttr && STI.hasFeature(RISCV::FeatureStdExtA)) {87unsigned AtomicABITag = static_cast<unsigned>(88STI.hasFeature(RISCV::FeatureNoTrailingSeqCstFence)89? RISCVAttrs::RISCVAtomicAbiTag::A6C90: RISCVAttrs::RISCVAtomicAbiTag::A6S);91emitAttribute(RISCVAttrs::ATOMIC_ABI, AtomicABITag);92}93}9495// This part is for ascii assembly output96RISCVTargetAsmStreamer::RISCVTargetAsmStreamer(MCStreamer &S,97formatted_raw_ostream &OS)98: RISCVTargetStreamer(S), OS(OS) {}99100void RISCVTargetAsmStreamer::emitDirectiveOptionPush() {101OS << "\t.option\tpush\n";102}103104void RISCVTargetAsmStreamer::emitDirectiveOptionPop() {105OS << "\t.option\tpop\n";106}107108void RISCVTargetAsmStreamer::emitDirectiveOptionPIC() {109OS << "\t.option\tpic\n";110}111112void RISCVTargetAsmStreamer::emitDirectiveOptionNoPIC() {113OS << "\t.option\tnopic\n";114}115116void RISCVTargetAsmStreamer::emitDirectiveOptionRVC() {117OS << "\t.option\trvc\n";118}119120void RISCVTargetAsmStreamer::emitDirectiveOptionNoRVC() {121OS << "\t.option\tnorvc\n";122}123124void RISCVTargetAsmStreamer::emitDirectiveOptionRelax() {125OS << "\t.option\trelax\n";126}127128void RISCVTargetAsmStreamer::emitDirectiveOptionNoRelax() {129OS << "\t.option\tnorelax\n";130}131132void RISCVTargetAsmStreamer::emitDirectiveOptionArch(133ArrayRef<RISCVOptionArchArg> Args) {134OS << "\t.option\tarch";135for (const auto &Arg : Args) {136OS << ", ";137switch (Arg.Type) {138case RISCVOptionArchArgType::Full:139break;140case RISCVOptionArchArgType::Plus:141OS << "+";142break;143case RISCVOptionArchArgType::Minus:144OS << "-";145break;146}147OS << Arg.Value;148}149OS << "\n";150}151152void RISCVTargetAsmStreamer::emitDirectiveVariantCC(MCSymbol &Symbol) {153OS << "\t.variant_cc\t" << Symbol.getName() << "\n";154}155156void RISCVTargetAsmStreamer::emitAttribute(unsigned Attribute, unsigned Value) {157OS << "\t.attribute\t" << Attribute << ", " << Twine(Value) << "\n";158}159160void RISCVTargetAsmStreamer::emitTextAttribute(unsigned Attribute,161StringRef String) {162OS << "\t.attribute\t" << Attribute << ", \"" << String << "\"\n";163}164165void RISCVTargetAsmStreamer::emitIntTextAttribute(unsigned Attribute,166unsigned IntValue,167StringRef StringValue) {}168169void RISCVTargetAsmStreamer::finishAttributeSection() {}170171172