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