xref: /llvm-project/llvm/lib/Target/Sparc/MCTargetDesc/SparcTargetStreamer.cpp (revision aca971d336d9c7650120fc0fd6dfe58866408216)
1 //===-- SparcTargetStreamer.cpp - Sparc Target Streamer Methods -----------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file provides Sparc specific target streamer methods.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #include "SparcTargetStreamer.h"
14 #include "SparcInstPrinter.h"
15 #include "SparcMCTargetDesc.h"
16 #include "llvm/BinaryFormat/ELF.h"
17 #include "llvm/MC/MCELFObjectWriter.h"
18 #include "llvm/MC/MCRegister.h"
19 #include "llvm/MC/MCSubtargetInfo.h"
20 #include "llvm/Support/FormattedStream.h"
21 
22 using namespace llvm;
23 
24 static unsigned getEFlagsForFeatureSet(const MCSubtargetInfo &STI) {
25   unsigned EFlags = 0;
26 
27   if (STI.hasFeature(Sparc::FeatureV8Plus))
28     EFlags |= ELF::EF_SPARC_32PLUS;
29 
30   return EFlags;
31 }
32 
33 // pin vtable to this file
34 SparcTargetStreamer::SparcTargetStreamer(MCStreamer &S) : MCTargetStreamer(S) {}
35 
36 void SparcTargetStreamer::anchor() {}
37 
38 SparcTargetAsmStreamer::SparcTargetAsmStreamer(MCStreamer &S,
39                                                formatted_raw_ostream &OS)
40     : SparcTargetStreamer(S), OS(OS) {}
41 
42 void SparcTargetAsmStreamer::emitSparcRegisterIgnore(unsigned reg) {
43   OS << "\t.register "
44      << "%" << StringRef(SparcInstPrinter::getRegisterName(reg)).lower()
45      << ", #ignore\n";
46 }
47 
48 void SparcTargetAsmStreamer::emitSparcRegisterScratch(unsigned reg) {
49   OS << "\t.register "
50      << "%" << StringRef(SparcInstPrinter::getRegisterName(reg)).lower()
51      << ", #scratch\n";
52 }
53 
54 SparcTargetELFStreamer::SparcTargetELFStreamer(MCStreamer &S,
55                                                const MCSubtargetInfo &STI)
56     : SparcTargetStreamer(S) {
57   ELFObjectWriter &W = getStreamer().getWriter();
58   unsigned EFlags = W.getELFHeaderEFlags();
59 
60   EFlags |= getEFlagsForFeatureSet(STI);
61 
62   W.setELFHeaderEFlags(EFlags);
63 }
64 
65 MCELFStreamer &SparcTargetELFStreamer::getStreamer() {
66   return static_cast<MCELFStreamer &>(Streamer);
67 }
68