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