blob: acbb04790af60ffc63fd422cb3ed31c729b2025f [file] [log] [blame]
Jason W Kimd4d4f4f2010-09-30 02:17:26 +00001//===-- ARMAsmBackend.cpp - ARM Assembler Backend -------------------------===//
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#include "llvm/Target/TargetAsmBackend.h"
11#include "ARM.h"
12//FIXME: add #include "ARMFixupKinds.h"
13#include "llvm/ADT/Twine.h"
14#include "llvm/MC/ELFObjectWriter.h"
15#include "llvm/MC/MCAssembler.h"
16#include "llvm/MC/MCExpr.h"
17#include "llvm/MC/MCObjectWriter.h"
Jason W Kimd4d4f4f2010-09-30 02:17:26 +000018#include "llvm/MC/MCSectionELF.h"
19#include "llvm/MC/MCSectionMachO.h"
20#include "llvm/MC/MachObjectWriter.h"
21#include "llvm/Support/ErrorHandling.h"
22#include "llvm/Support/raw_ostream.h"
23#include "llvm/Target/TargetRegistry.h"
24#include "llvm/Target/TargetAsmBackend.h"
25using namespace llvm;
26
27namespace {
28class ARMAsmBackend : public TargetAsmBackend {
29public:
30 ARMAsmBackend(const Target &T)
Jim Grosbachf73fd722010-09-30 03:21:00 +000031 : TargetAsmBackend(T) {
Jason W Kimd4d4f4f2010-09-30 02:17:26 +000032 }
33
34 bool MayNeedRelaxation(const MCInst &Inst) const;
35
36 void RelaxInstruction(const MCInst &Inst, MCInst &Res) const;
37
38 bool WriteNopData(uint64_t Count, MCObjectWriter *OW) const;
39};
40
41bool ARMAsmBackend::MayNeedRelaxation(const MCInst &Inst) const {
42 // FIXME: Thumb targets, different move constant targets..
43 return false;
44}
45
46void ARMAsmBackend::RelaxInstruction(const MCInst &Inst, MCInst &Res) const {
47 assert(0 && "ARMAsmBackend::RelaxInstruction() unimplemented");
48 return;
49}
50
51bool ARMAsmBackend::WriteNopData(uint64_t Count, MCObjectWriter *OW) const {
52 assert(0 && "ARMAsmBackend::WriteNopData() unimplemented");
Jim Grosbachf73fd722010-09-30 03:21:00 +000053 if ((Count % 4) != 0) {
Jason W Kimd4d4f4f2010-09-30 02:17:26 +000054 // Fixme: % 2 for Thumb?
55 return false;
56 }
57 return false;
Jim Grosbach87dc3aa2010-09-30 03:20:34 +000058}
Jason W Kimd4d4f4f2010-09-30 02:17:26 +000059} // end anonymous namespace
60
61namespace {
62// FIXME: This should be in a separate file.
63// ELF is an ELF of course...
64class ELFARMAsmBackend : public ARMAsmBackend {
65public:
66 Triple::OSType OSType;
67 ELFARMAsmBackend(const Target &T, Triple::OSType _OSType)
68 : ARMAsmBackend(T), OSType(_OSType) {
69 HasAbsolutizedSet = true;
70 HasScatteredSymbols = true;
71 }
72
73 void ApplyFixup(const MCFixup &Fixup, MCDataFragment &DF,
74 uint64_t Value) const;
75
76 bool isVirtualSection(const MCSection &Section) const {
77 const MCSectionELF &SE = static_cast<const MCSectionELF&>(Section);
78 return SE.getType() == MCSectionELF::SHT_NOBITS;
79 }
80
81 MCObjectWriter *createObjectWriter(raw_ostream &OS) const {
82 return new ELFObjectWriter(OS, /*Is64Bit=*/false,
83 OSType,
84 /*IsLittleEndian=*/true,
85 /*HasRelocationAddend=*/false);
86 }
Kevin Enderby8ebf6622010-09-30 16:38:07 +000087
88 unsigned getPointerSize() const {
89 return 4;
Jim Grosbachaf2a8b22010-09-30 17:19:17 +000090 }
Jason W Kimd4d4f4f2010-09-30 02:17:26 +000091};
92
Jason W Kima4c27242010-09-30 14:58:19 +000093// Fixme: can we raise this to share code between Darwin and ELF?
Jason W Kimd4d4f4f2010-09-30 02:17:26 +000094void ELFARMAsmBackend::ApplyFixup(const MCFixup &Fixup, MCDataFragment &DF,
95 uint64_t Value) const {
96 assert(0 && "ELFARMAsmBackend::ApplyFixup() unimplemented");
97}
98
99// FIXME: This should be in a separate file.
100class DarwinARMAsmBackend : public ARMAsmBackend {
101public:
102 DarwinARMAsmBackend(const Target &T)
103 : ARMAsmBackend(T) {
104 HasAbsolutizedSet = true;
105 HasScatteredSymbols = true;
106 assert(0 && "DarwinARMAsmBackend::DarwinARMAsmBackend() unimplemented");
107 }
108
109 void ApplyFixup(const MCFixup &Fixup, MCDataFragment &DF,
110 uint64_t Value) const;
111
112 bool isVirtualSection(const MCSection &Section) const {
113 const MCSectionMachO &SMO = static_cast<const MCSectionMachO&>(Section);
114 return (SMO.getType() == MCSectionMachO::S_ZEROFILL ||
115 SMO.getType() == MCSectionMachO::S_GB_ZEROFILL ||
116 SMO.getType() == MCSectionMachO::S_THREAD_LOCAL_ZEROFILL);
117 }
118
119 MCObjectWriter *createObjectWriter(raw_ostream &OS) const {
120 return new MachObjectWriter(OS, /*Is64Bit=*/false);
121 }
122
Kevin Enderby8ebf6622010-09-30 16:38:07 +0000123 unsigned getPointerSize() const {
124 return 4;
Jim Grosbachaf2a8b22010-09-30 17:19:17 +0000125 }
Kevin Enderby8ebf6622010-09-30 16:38:07 +0000126
Jason W Kimd4d4f4f2010-09-30 02:17:26 +0000127 virtual bool doesSectionRequireSymbols(const MCSection &Section) const {
128 return false;
129 }
130};
131
132void DarwinARMAsmBackend::ApplyFixup(const MCFixup &Fixup, MCDataFragment &DF,
133 uint64_t Value) const {
134 assert(0 && "DarwinARMAsmBackend::ApplyFixup() unimplemented");
135}
Jim Grosbachf73fd722010-09-30 03:21:00 +0000136} // end anonymous namespace
Jason W Kimd4d4f4f2010-09-30 02:17:26 +0000137
138TargetAsmBackend *llvm::createARMAsmBackend(const Target &T,
139 const std::string &TT) {
140 switch (Triple(TT).getOS()) {
141 case Triple::Darwin:
142 return new DarwinARMAsmBackend(T);
143 case Triple::MinGW32:
144 case Triple::Cygwin:
145 case Triple::Win32:
146 assert(0 && "Windows not supported on ARM");
147 default:
148 return new ELFARMAsmBackend(T, Triple(TT).getOS());
149 }
150}