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