brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.6 KiB · 1a3e373 Raw
69 lines · cpp
1//==-- SystemZTargetStreamer.cpp - SystemZ Target Streamer Methods ----------=//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8///9/// \file10/// This file defines SystemZ-specific target streamer classes.11/// These are for implementing support for target-specific assembly directives.12///13//===----------------------------------------------------------------------===//14 15#include "SystemZTargetStreamer.h"16#include "SystemZHLASMAsmStreamer.h"17#include "llvm/MC/MCAsmInfo.h"18#include "llvm/MC/MCObjectFileInfo.h"19 20using namespace llvm;21 22void SystemZTargetStreamer::emitConstantPools() {23  // Emit EXRL target instructions.24  if (EXRLTargets2Sym.empty())25    return;26  // Switch to the .text section.27  const MCObjectFileInfo &OFI = *Streamer.getContext().getObjectFileInfo();28  Streamer.switchSection(OFI.getTextSection());29  for (auto &I : EXRLTargets2Sym) {30    Streamer.emitLabel(I.second);31    const MCInstSTIPair &MCI_STI = I.first;32    Streamer.emitInstruction(MCI_STI.first, *MCI_STI.second);33  }34  EXRLTargets2Sym.clear();35}36 37SystemZHLASMAsmStreamer &SystemZTargetHLASMStreamer::getHLASMStreamer() {38  return static_cast<SystemZHLASMAsmStreamer &>(getStreamer());39}40 41void SystemZTargetHLASMStreamer::emitExtern(StringRef Sym) {42  getStreamer().emitRawText(Twine(" EXTRN ") + Twine(Sym));43}44 45void SystemZTargetHLASMStreamer::emitEnd() { getHLASMStreamer().emitEnd(); }46 47// HLASM statements can only perform a single operation at a time48const MCExpr *SystemZTargetHLASMStreamer::createWordDiffExpr(49    MCContext &Ctx, const MCSymbol *Hi, const MCSymbol *Lo) {50  assert(Hi && Lo && "Symbols required to calculate expression");51  MCSymbol *Temp = Ctx.createTempSymbol();52  OS << Temp->getName() << " EQU ";53  const MCBinaryExpr *TempExpr = MCBinaryExpr::createSub(54      MCSymbolRefExpr::create(Hi, Ctx), MCSymbolRefExpr::create(Lo, Ctx), Ctx);55  Ctx.getAsmInfo()->printExpr(OS, *TempExpr);56  OS << "\n";57  return MCBinaryExpr::createLShr(MCSymbolRefExpr::create(Temp, Ctx),58                                  MCConstantExpr::create(1, Ctx), Ctx);59}60 61const MCExpr *SystemZTargetGOFFStreamer::createWordDiffExpr(62    MCContext &Ctx, const MCSymbol *Hi, const MCSymbol *Lo) {63  assert(Hi && Lo && "Symbols required to calculate expression");64  return MCBinaryExpr::createLShr(65      MCBinaryExpr::createSub(MCSymbolRefExpr::create(Hi, Ctx),66                              MCSymbolRefExpr::create(Lo, Ctx), Ctx),67      MCConstantExpr::create(1, Ctx), Ctx);68}69