1f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//===-- AMDGPUAsmBackend.cpp - AMDGPU Assembler Backend -------------------===//
2f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//
3f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//                     The LLVM Compiler Infrastructure
4f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//
5f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard// This file is distributed under the University of Illinois Open Source
6f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard// License. See LICENSE.TXT for details.
7f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//
8f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard/// \file
9f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//===----------------------------------------------------------------------===//
10f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
11f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "MCTargetDesc/AMDGPUMCTargetDesc.h"
12f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "llvm/ADT/StringRef.h"
13f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "llvm/MC/MCAsmBackend.h"
14f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "llvm/MC/MCAssembler.h"
15f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "llvm/MC/MCObjectWriter.h"
16f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "llvm/MC/MCValue.h"
17f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "llvm/Support/TargetRegistry.h"
18f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
19f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardusing namespace llvm;
20f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
21f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardnamespace {
22f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
23f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardclass AMDGPUMCObjectWriter : public MCObjectWriter {
24f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardpublic:
25f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  AMDGPUMCObjectWriter(raw_ostream &OS) : MCObjectWriter(OS, true) { }
26dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void ExecutePostLayoutBinding(MCAssembler &Asm,
27dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                const MCAsmLayout &Layout) override {
28f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    //XXX: Implement if necessary.
29f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  }
3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void RecordRelocation(const MCAssembler &Asm, const MCAsmLayout &Layout,
3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                        const MCFragment *Fragment, const MCFixup &Fixup,
3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                        MCValue Target, bool &IsPCRel,
3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                        uint64_t &FixedValue) override {
34f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    assert(!"Not implemented");
35f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  }
36f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
37dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void WriteObject(MCAssembler &Asm, const MCAsmLayout &Layout) override;
38f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
39f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard};
40f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
41f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardclass AMDGPUAsmBackend : public MCAsmBackend {
42f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardpublic:
43f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  AMDGPUAsmBackend(const Target &T)
44f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    : MCAsmBackend() {}
45f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  unsigned getNumFixupKinds() const override { return 0; };
47dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void applyFixup(const MCFixup &Fixup, char *Data, unsigned DataSize,
48dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                  uint64_t Value, bool IsPCRel) const override;
49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  bool fixupNeedsRelaxation(const MCFixup &Fixup, uint64_t Value,
50dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                            const MCRelaxableFragment *DF,
51dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                            const MCAsmLayout &Layout) const override {
52f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    return false;
53f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  }
54dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void relaxInstruction(const MCInst &Inst, MCInst &Res) const override {
55f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    assert(!"Not implemented");
56f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  }
57dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  bool mayNeedRelaxation(const MCInst &Inst) const override { return false; }
58dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  bool writeNopData(uint64_t Count, MCObjectWriter *OW) const override {
59f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    return true;
60f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  }
61f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard};
62f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
63f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard} //End anonymous namespace
64f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
65f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardvoid AMDGPUMCObjectWriter::WriteObject(MCAssembler &Asm,
66f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                       const MCAsmLayout &Layout) {
67f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  for (MCAssembler::iterator I = Asm.begin(), E = Asm.end(); I != E; ++I) {
68f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    Asm.writeSectionData(I, Layout);
69f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  }
70f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
71f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
723ee6391e0cddf8d94e2fa441d661c23e494a8489Tom Stellardvoid AMDGPUAsmBackend::applyFixup(const MCFixup &Fixup, char *Data,
7336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                  unsigned DataSize, uint64_t Value,
7436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                  bool IsPCRel) const {
753ee6391e0cddf8d94e2fa441d661c23e494a8489Tom Stellard
763ee6391e0cddf8d94e2fa441d661c23e494a8489Tom Stellard  uint16_t *Dst = (uint16_t*)(Data + Fixup.getOffset());
773ee6391e0cddf8d94e2fa441d661c23e494a8489Tom Stellard  assert(Fixup.getKind() == FK_PCRel_4);
783ee6391e0cddf8d94e2fa441d661c23e494a8489Tom Stellard  *Dst = (Value - 4) / 4;
793ee6391e0cddf8d94e2fa441d661c23e494a8489Tom Stellard}
803a63bf27c54e0975a219f723381494f2be52c7e2Tom Stellard
813a63bf27c54e0975a219f723381494f2be52c7e2Tom Stellard//===----------------------------------------------------------------------===//
823a63bf27c54e0975a219f723381494f2be52c7e2Tom Stellard// ELFAMDGPUAsmBackend class
833a63bf27c54e0975a219f723381494f2be52c7e2Tom Stellard//===----------------------------------------------------------------------===//
843a63bf27c54e0975a219f723381494f2be52c7e2Tom Stellard
85879b071bf539163f90a5ef449d3e6a9ec73faa2fBenjamin Kramernamespace {
86879b071bf539163f90a5ef449d3e6a9ec73faa2fBenjamin Kramer
873a63bf27c54e0975a219f723381494f2be52c7e2Tom Stellardclass ELFAMDGPUAsmBackend : public AMDGPUAsmBackend {
883a63bf27c54e0975a219f723381494f2be52c7e2Tom Stellardpublic:
893a63bf27c54e0975a219f723381494f2be52c7e2Tom Stellard  ELFAMDGPUAsmBackend(const Target &T) : AMDGPUAsmBackend(T) { }
903a63bf27c54e0975a219f723381494f2be52c7e2Tom Stellard
91dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MCObjectWriter *createObjectWriter(raw_ostream &OS) const override {
923a63bf27c54e0975a219f723381494f2be52c7e2Tom Stellard    return createAMDGPUELFObjectWriter(OS);
933a63bf27c54e0975a219f723381494f2be52c7e2Tom Stellard  }
943a63bf27c54e0975a219f723381494f2be52c7e2Tom Stellard};
953a63bf27c54e0975a219f723381494f2be52c7e2Tom Stellard
96879b071bf539163f90a5ef449d3e6a9ec73faa2fBenjamin Kramer} // end anonymous namespace
97879b071bf539163f90a5ef449d3e6a9ec73faa2fBenjamin Kramer
98c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill WendlingMCAsmBackend *llvm::createAMDGPUAsmBackend(const Target &T,
99c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling                                           const MCRegisterInfo &MRI,
100c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling                                           StringRef TT,
1013a63bf27c54e0975a219f723381494f2be52c7e2Tom Stellard                                           StringRef CPU) {
1023a63bf27c54e0975a219f723381494f2be52c7e2Tom Stellard  return new ELFAMDGPUAsmBackend(T);
1033a63bf27c54e0975a219f723381494f2be52c7e2Tom Stellard}
104