1 //===--------- AVRMCELFStreamer.cpp - AVR subclass of MCELFStreamer -------===// 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 is a stub that parses a MCInst bundle and passes the 10 // instructions on to the real streamer. 11 // 12 //===----------------------------------------------------------------------===// 13 #include "MCTargetDesc/AVRMCELFStreamer.h" 14 #include "llvm/MC/MCContext.h" 15 #include "llvm/MC/MCExpr.h" 16 #include "llvm/MC/MCObjectWriter.h" 17 #include "llvm/MC/MCSymbol.h" 18 19 #define DEBUG_TYPE "avrmcelfstreamer" 20 21 using namespace llvm; 22 23 void AVRMCELFStreamer::emitValueForModiferKind( 24 const MCSymbol *Sym, unsigned SizeInBytes, SMLoc Loc, 25 AVRMCExpr::VariantKind ModifierKind) { 26 MCSymbolRefExpr::VariantKind Kind = MCSymbolRefExpr::VK_AVR_NONE; 27 if (ModifierKind == AVRMCExpr::VK_AVR_None) { 28 Kind = MCSymbolRefExpr::VK_AVR_DIFF8; 29 if (SizeInBytes == SIZE_LONG) 30 Kind = MCSymbolRefExpr::VK_AVR_DIFF32; 31 else if (SizeInBytes == SIZE_WORD) 32 Kind = MCSymbolRefExpr::VK_AVR_DIFF16; 33 } else if (ModifierKind == AVRMCExpr::VK_AVR_LO8) 34 Kind = MCSymbolRefExpr::VK_AVR_LO8; 35 else if (ModifierKind == AVRMCExpr::VK_AVR_HI8) 36 Kind = MCSymbolRefExpr::VK_AVR_HI8; 37 else if (ModifierKind == AVRMCExpr::VK_AVR_HH8) 38 Kind = MCSymbolRefExpr::VK_AVR_HLO8; 39 MCELFStreamer::emitValue(MCSymbolRefExpr::create(Sym, Kind, getContext()), 40 SizeInBytes, Loc); 41 } 42 43 namespace llvm { 44 MCStreamer *createAVRELFStreamer(Triple const &TT, MCContext &Context, 45 std::unique_ptr<MCAsmBackend> MAB, 46 std::unique_ptr<MCObjectWriter> OW, 47 std::unique_ptr<MCCodeEmitter> CE) { 48 return new AVRMCELFStreamer(Context, std::move(MAB), std::move(OW), 49 std::move(CE)); 50 } 51 52 } // end namespace llvm 53