1235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard//===-- AMDGPUAsmBackend.cpp - AMDGPU Assembler Backend -------------------===//
2235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard//
3235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard//                     The LLVM Compiler Infrastructure
4235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard//
5235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard// This file is distributed under the University of Illinois Open Source
6235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard// License. See LICENSE.TXT for details.
7235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard//
8235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard//===----------------------------------------------------------------------===//
9235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard
10228a6641ccddaf24a993f827af1e97379785985aTom Stellard#include "MCTargetDesc/AMDGPUMCTargetDesc.h"
11235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard#include "llvm/ADT/StringRef.h"
12235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard#include "llvm/MC/MCAsmBackend.h"
13235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard#include "llvm/MC/MCAssembler.h"
14235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard#include "llvm/MC/MCObjectWriter.h"
15235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard#include "llvm/MC/MCValue.h"
16235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard#include "llvm/Support/TargetRegistry.h"
17235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard
18235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellardusing namespace llvm;
19235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard
20235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellardnamespace {
21235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard
22235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellardclass AMDGPUMCObjectWriter : public MCObjectWriter {
23235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellardpublic:
24235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard  AMDGPUMCObjectWriter(raw_ostream &OS) : MCObjectWriter(OS, true) { }
25235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard  virtual void ExecutePostLayoutBinding(MCAssembler &Asm,
26235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard                                        const MCAsmLayout &Layout) {
27235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard    //XXX: Implement if necessary.
28235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard  }
29235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard  virtual void RecordRelocation(const MCAssembler &Asm,
30235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard                                const MCAsmLayout &Layout,
31235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard                                const MCFragment *Fragment,
32235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard                                const MCFixup &Fixup,
33235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard                                MCValue Target, uint64_t &FixedValue) {
34235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard    assert(!"Not implemented");
35235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard  }
36235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard
37235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard  virtual void WriteObject(MCAssembler &Asm, const MCAsmLayout &Layout);
38235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard
39235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard};
40235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard
41235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellardclass AMDGPUAsmBackend : public MCAsmBackend {
42235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellardpublic:
43235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard  AMDGPUAsmBackend(const Target &T)
44235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard    : MCAsmBackend() {}
45235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard
46235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard  virtual AMDGPUMCObjectWriter *createObjectWriter(raw_ostream &OS) const;
47235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard  virtual unsigned getNumFixupKinds() const { return 0; };
48235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard  virtual void applyFixup(const MCFixup &Fixup, char *Data, unsigned DataSize,
49235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard                          uint64_t Value) const { assert(!"Not implemented"); }
50235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard  virtual bool fixupNeedsRelaxation(const MCFixup &Fixup, uint64_t Value,
51235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard                                    const MCInstFragment *DF,
52235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard                                    const MCAsmLayout &Layout) const {
53235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard    return false;
54235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard  }
55235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard  virtual void relaxInstruction(const MCInst &Inst, MCInst &Res) const {
56235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard    assert(!"Not implemented");
57235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard  }
58235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard  virtual bool mayNeedRelaxation(const MCInst &Inst) const { return false; }
59235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard  virtual bool writeNopData(uint64_t Count, MCObjectWriter *OW) const {
60235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard    return true;
61235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard  }
62235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard};
63235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard
64235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard} //End anonymous namespace
65235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard
66235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellardvoid AMDGPUMCObjectWriter::WriteObject(MCAssembler &Asm,
67235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard                                       const MCAsmLayout &Layout) {
68235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard  for (MCAssembler::iterator I = Asm.begin(), E = Asm.end(); I != E; ++I) {
69235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard    Asm.writeSectionData(I, Layout);
70235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard  }
71235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard}
72235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard
73235318a578b3d7772a60590c7e76791ed6d1a78eTom StellardMCAsmBackend *llvm::createAMDGPUAsmBackend(const Target &T, StringRef TT) {
74235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard  return new AMDGPUAsmBackend(T);
75235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard}
76235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard
77235318a578b3d7772a60590c7e76791ed6d1a78eTom StellardAMDGPUMCObjectWriter * AMDGPUAsmBackend::createObjectWriter(
78235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard                                                        raw_ostream &OS) const {
79235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard  return new AMDGPUMCObjectWriter(OS);
80235318a578b3d7772a60590c7e76791ed6d1a78eTom Stellard}
81