From 0fcb9192e4bdcdd40cb3eb9d80887dd6313283c8 Mon Sep 17 00:00:00 2001 From: Tim Renouf Date: Tue, 14 May 2019 16:17:14 +0000 Subject: [PATCH] [AMDGPU] Fixed +DumpCode The +DumpCode attribute is a horrible hack in AMDGPU to embed the disassembly of the generated code into the elf file. It is used by LLPC to implement an extension that allows the application to read back the disassembly of the code. Longer term, we should re-implement that by using the LLVM disassembler from the Vulkan driver. Recent LLVM changes broke +DumpCode. With -filetype=asm it crashed, and with -filetype=obj I think it did not include any instructions, only the labels. Fixed with this commit: now it has no effect with -filetype=asm, and works as intended with -filetype=obj. Differential Revision: https://reviews.llvm.org/D60682 Change-Id: I6436d86fe2ea220d74a643a85e64753747c9366b git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@360688 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp | 20 ++++++++++++++++---- lib/Target/AMDGPU/AMDGPUAsmPrinter.h | 3 +++ lib/Target/AMDGPU/AMDGPUMCInstLower.cpp | 13 +++++-------- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp b/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp index 250f6e30b82..9154139e4c5 100644 --- a/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp +++ b/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp @@ -34,6 +34,7 @@ #include "llvm/BinaryFormat/ELF.h" #include "llvm/CodeGen/MachineFrameInfo.h" #include "llvm/IR/DiagnosticInfo.h" +#include "llvm/MC/MCAssembler.h" #include "llvm/MC/MCContext.h" #include "llvm/MC/MCSectionELF.h" #include "llvm/MC/MCStreamer.h" @@ -204,6 +205,18 @@ void AMDGPUAsmPrinter::EmitFunctionBodyStart() { if (STM.isAmdHsaOS()) HSAMetadataStream->emitKernel(*MF, CurrentProgramInfo); + + DumpCodeInstEmitter = nullptr; + if (STM.dumpCode()) { + // For -dumpcode, get the assembler out of the streamer, even if it does + // not really want to let us have it. This only works with -filetype=obj. + bool SaveFlag = OutStreamer->getUseAssemblerInfoForParsing(); + OutStreamer->setUseAssemblerInfoForParsing(true); + MCAssembler *Assembler = OutStreamer->getAssemblerPtr(); + OutStreamer->setUseAssemblerInfoForParsing(SaveFlag); + if (Assembler) + DumpCodeInstEmitter = Assembler->getEmitterPtr(); + } } void AMDGPUAsmPrinter::EmitFunctionBodyEnd() { @@ -261,7 +274,7 @@ void AMDGPUAsmPrinter::EmitFunctionEntryLabel() { getTargetStreamer()->EmitAMDGPUSymbolType( SymbolName, ELF::STT_AMDGPU_HSA_KERNEL); } - if (STM.dumpCode()) { + if (DumpCodeInstEmitter) { // Disassemble function name label to text. DisasmLines.push_back(MF->getName().str() + ":"); DisasmLineMaxLen = std::max(DisasmLineMaxLen, DisasmLines.back().size()); @@ -272,8 +285,7 @@ void AMDGPUAsmPrinter::EmitFunctionEntryLabel() { } void AMDGPUAsmPrinter::EmitBasicBlockStart(const MachineBasicBlock &MBB) const { - const GCNSubtarget &STI = MBB.getParent()->getSubtarget(); - if (STI.dumpCode() && !isBlockOnlyReachableByFallthrough(&MBB)) { + if (DumpCodeInstEmitter && !isBlockOnlyReachableByFallthrough(&MBB)) { // Write a line for the basic block label if it is not only fallthrough. DisasmLines.push_back( (Twine("BB") + Twine(getFunctionNumber()) @@ -479,7 +491,7 @@ bool AMDGPUAsmPrinter::runOnMachineFunction(MachineFunction &MF) { false); } - if (STM.dumpCode()) { + if (DumpCodeInstEmitter) { OutStreamer->SwitchSection( Context.getELFSection(".AMDGPU.disasm", ELF::SHT_NOTE, 0)); diff --git a/lib/Target/AMDGPU/AMDGPUAsmPrinter.h b/lib/Target/AMDGPU/AMDGPUAsmPrinter.h index 4d4e87a4015..cf77034329e 100644 --- a/lib/Target/AMDGPU/AMDGPUAsmPrinter.h +++ b/lib/Target/AMDGPU/AMDGPUAsmPrinter.h @@ -32,6 +32,7 @@ namespace llvm { class AMDGPUMachineFunction; class AMDGPUTargetStreamer; +class MCCodeEmitter; class MCOperand; class GCNSubtarget; @@ -57,6 +58,8 @@ private: std::unique_ptr HSAMetadataStream; + MCCodeEmitter *DumpCodeInstEmitter = nullptr; + uint64_t getFunctionCodeSize(const MachineFunction &MF) const; SIFunctionResourceInfo analyzeResourceUsage(const MachineFunction &MF) const; diff --git a/lib/Target/AMDGPU/AMDGPUMCInstLower.cpp b/lib/Target/AMDGPU/AMDGPUMCInstLower.cpp index 5fc76989981..ce19f2559ef 100644 --- a/lib/Target/AMDGPU/AMDGPUMCInstLower.cpp +++ b/lib/Target/AMDGPU/AMDGPUMCInstLower.cpp @@ -325,14 +325,13 @@ void AMDGPUAsmPrinter::EmitInstruction(const MachineInstr *MI) { } #endif - if (STI.dumpCode()) { - // Disassemble instruction/operands to text. + if (DumpCodeInstEmitter) { + // Disassemble instruction/operands to text DisasmLines.resize(DisasmLines.size() + 1); std::string &DisasmLine = DisasmLines.back(); raw_string_ostream DisasmStream(DisasmLine); - AMDGPUInstPrinter InstPrinter(*TM.getMCAsmInfo(), - *STI.getInstrInfo(), + AMDGPUInstPrinter InstPrinter(*TM.getMCAsmInfo(), *STI.getInstrInfo(), *STI.getRegisterInfo()); InstPrinter.printInst(&TmpInst, DisasmStream, StringRef(), STI); @@ -341,10 +340,8 @@ void AMDGPUAsmPrinter::EmitInstruction(const MachineInstr *MI) { SmallVector CodeBytes; raw_svector_ostream CodeStream(CodeBytes); - auto &ObjStreamer = static_cast(*OutStreamer); - MCCodeEmitter &InstEmitter = ObjStreamer.getAssembler().getEmitter(); - InstEmitter.encodeInstruction(TmpInst, CodeStream, Fixups, - MF->getSubtarget()); + DumpCodeInstEmitter->encodeInstruction( + TmpInst, CodeStream, Fixups, MF->getSubtarget()); HexLines.resize(HexLines.size() + 1); std::string &HexLine = HexLines.back(); raw_string_ostream HexStream(HexLine); -- 2.40.0