summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/Hexagon/MCTargetDesc
diff options
context:
space:
mode:
authorColin LeMahieu <colinl@codeaurora.org>2015-06-18 20:43:50 +0000
committerColin LeMahieu <colinl@codeaurora.org>2015-06-18 20:43:50 +0000
commitd2158755eb718da05fc0ba817b9b7fb64d74a54f (patch)
tree8c4d3c3a39fbedc81d99959ccb8ca4360994cb4d /llvm/lib/Target/Hexagon/MCTargetDesc
parent48a9b71f4ae154f9b81007808b3f1e4edc1c588a (diff)
downloadbcm5719-llvm-d2158755eb718da05fc0ba817b9b7fb64d74a54f.tar.gz
bcm5719-llvm-d2158755eb718da05fc0ba817b9b7fb64d74a54f.zip
[Hexagon] Printing packet brackets when asm printing and adding a number of tests that test packet brackets.
llvm-svn: 240051
Diffstat (limited to 'llvm/lib/Target/Hexagon/MCTargetDesc')
-rw-r--r--llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCTargetDesc.cpp64
1 files changed, 63 insertions, 1 deletions
diff --git a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCTargetDesc.cpp b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCTargetDesc.cpp
index 4e7bca634e3..bf6fb14dcca 100644
--- a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCTargetDesc.cpp
+++ b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCTargetDesc.cpp
@@ -11,9 +11,10 @@
//
//===----------------------------------------------------------------------===//
+#include "HexagonMCTargetDesc.h"
+#include "Hexagon.h"
#include "HexagonMCAsmInfo.h"
#include "HexagonMCELFStreamer.h"
-#include "HexagonMCTargetDesc.h"
#include "MCTargetDesc/HexagonInstPrinter.h"
#include "llvm/MC/MCCodeGenInfo.h"
#include "llvm/MC/MCContext.h"
@@ -59,6 +60,57 @@ createHexagonMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS) {
}
namespace {
+class HexagonTargetAsmStreamer : public HexagonTargetStreamer {
+ MCContext &Ctx;
+ formatted_raw_ostream &OS;
+ bool isVerboseAsm;
+ MCInstPrinter &IP;
+public:
+ HexagonTargetAsmStreamer(MCStreamer &S,
+ formatted_raw_ostream &OS, bool isVerboseAsm,
+ MCInstPrinter &IP)
+ : HexagonTargetStreamer(S), Ctx(Ctx), OS(OS), isVerboseAsm(isVerboseAsm),
+ IP(IP) {}
+ MCStreamer &getStreamer() { return Streamer; }
+ void prettyPrintAsm(MCInstPrinter &InstPrinter, raw_ostream &OS,
+ const MCInst &Inst, const MCSubtargetInfo &STI) override {
+ assert(HexagonMCInstrInfo::isBundle(Inst));
+ assert(HexagonMCInstrInfo::bundleSize(Inst) <= HEXAGON_PACKET_SIZE);
+ std::string Buffer;
+ {
+ raw_string_ostream TempStream(Buffer);
+ InstPrinter.printInst(&Inst, TempStream, "", STI);
+ }
+ StringRef Contents(Buffer);
+ auto PacketBundle = Contents.rsplit('\n');
+ auto HeadTail = PacketBundle.first.split('\n');
+ auto Preamble = "\t{\n\t\t";
+ auto Separator = "";
+ while(!HeadTail.first.empty()) {
+ OS << Separator;
+ StringRef Inst;
+ auto Duplex = HeadTail.first.split('\v');
+ if(!Duplex.second.empty()){
+ OS << Duplex.first << "\n";
+ Inst = Duplex.second;
+ }
+ else {
+ if(!HeadTail.first.startswith("immext"))
+ Inst = Duplex.first;
+ }
+ OS << Preamble;
+ OS << Inst;
+ HeadTail = HeadTail.second.split('\n');
+ Preamble = "";
+ Separator = "\n\t\t";
+ }
+ if(HexagonMCInstrInfo::bundleSize(Inst) != 0)
+ OS << "\n\t}" << PacketBundle.second;
+ }
+};
+}
+
+namespace {
class HexagonTargetELFStreamer : public HexagonTargetStreamer {
public:
MCELFStreamer &getStreamer() {
@@ -126,6 +178,12 @@ static MCInstPrinter *createHexagonMCInstPrinter(const Triple &T,
return nullptr;
}
+MCTargetStreamer *createMCAsmTargetStreamer(
+ MCStreamer &S, formatted_raw_ostream &OS, MCInstPrinter *InstPrint,
+ bool IsVerboseAsm) {
+ return new HexagonTargetAsmStreamer(S, OS, IsVerboseAsm, *InstPrint);
+}
+
static MCStreamer *createMCStreamer(Triple const &T, MCContext &Context,
MCAsmBackend &MAB, raw_pwrite_stream &OS,
MCCodeEmitter *Emitter, bool RelaxAll) {
@@ -169,6 +227,10 @@ extern "C" void LLVMInitializeHexagonTargetMC() {
// Register the obj streamer
TargetRegistry::RegisterELFStreamer(TheHexagonTarget, createMCStreamer);
+ // Register the asm streamer
+ TargetRegistry::RegisterAsmTargetStreamer(TheHexagonTarget,
+ createMCAsmTargetStreamer);
+
// Register the MC Inst Printer
TargetRegistry::RegisterMCInstPrinter(TheHexagonTarget,
createHexagonMCInstPrinter);
OpenPOWER on IntegriCloud