1 //===-------- AMDGPUELFStreamer.cpp - ELF Object Output -------------------===// 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 "AMDGPUELFStreamer.h" 11 #include "Utils/AMDGPUBaseInfo.h" 12 #include "llvm/BinaryFormat/ELF.h" 13 #include "llvm/MC/MCAsmBackend.h" 14 #include "llvm/MC/MCCodeEmitter.h" 15 16 using namespace llvm; 17 18 AMDGPUELFStreamer::AMDGPUELFStreamer(const Triple &T, MCContext &Context, 19 std::unique_ptr<MCAsmBackend> MAB, 20 raw_pwrite_stream &OS, 21 std::unique_ptr<MCCodeEmitter> Emitter) 22 : MCELFStreamer(Context, std::move(MAB), OS, std::move(Emitter)) { 23 unsigned Arch = ELF::EF_AMDGPU_ARCH_NONE; 24 switch (T.getArch()) { 25 case Triple::r600: 26 Arch = ELF::EF_AMDGPU_ARCH_R600; 27 break; 28 case Triple::amdgcn: 29 Arch = ELF::EF_AMDGPU_ARCH_GCN; 30 break; 31 default: 32 break; 33 } 34 35 MCAssembler &MCA = getAssembler(); 36 unsigned EFlags = MCA.getELFHeaderEFlags(); 37 EFlags &= ~ELF::EF_AMDGPU_ARCH; 38 EFlags |= Arch; 39 MCA.setELFHeaderEFlags(EFlags); 40 } 41 42 MCELFStreamer *llvm::createAMDGPUELFStreamer( 43 const Triple &T, MCContext &Context, std::unique_ptr<MCAsmBackend> MAB, 44 raw_pwrite_stream &OS, std::unique_ptr<MCCodeEmitter> Emitter, 45 bool RelaxAll) { 46 return new AMDGPUELFStreamer(T, Context, std::move(MAB), OS, 47 std::move(Emitter)); 48 } 49