//===- AsmWriterInst.h - Classes encapsulating a printable inst -----------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// These classes implement a parser for assembly strings.
//
//===----------------------------------------------------------------------===//

#include "AsmWriterInst.h"
#include "CodeGenInstruction.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/TableGen/Error.h"
#include "llvm/TableGen/Record.h"

using namespace llvm;

static bool isIdentChar(char C) { return isAlnum(C) || C == '_'; }

std::string AsmWriterOperand::getCode(bool PassSubtarget) const {
  if (OperandType == isLiteralTextOperand) {
    if (Str.size() == 1)
      return "O << '" + Str + "';";
    return "O << \"" + Str + "\";";
  }

  if (OperandType == isLiteralStatementOperand)
    return Str;

  std::string Result = Str + "(MI";
  if (PCRel)
    Result += ", Address";
  if (MIOpNo != ~0U)
    Result += ", " + utostr(MIOpNo);
  if (PassSubtarget)
    Result += ", STI";
  Result += ", O";
  if (!MiModifier.empty())
    Result += ", \"" + MiModifier + '"';
  return Result + ");";
}

/// ParseAsmString - Parse the specified Instruction's AsmString into this
/// AsmWriterInst.
///
AsmWriterInst::AsmWriterInst(const CodeGenInstruction &CGI, unsigned CGIIndex,
                             unsigned Variant)
    : CGI(&CGI), CGIIndex(CGIIndex) {

  // NOTE: Any extensions to this code need to be mirrored in the
  // AsmPrinter::printInlineAsm code that executes as compile time (assuming
  // that inline asm strings should also get the new feature)!
  std::string AsmString = CGI.FlattenAsmStringVariants(CGI.AsmString, Variant);
  std::string::size_type LastEmitted = 0;
  while (LastEmitted != AsmString.size()) {
    std::string::size_type DollarPos =
        AsmString.find_first_of("$\\", LastEmitted);
    if (DollarPos == std::string::npos)
      DollarPos = AsmString.size();

    // Emit a constant string fragment.
    if (DollarPos != LastEmitted) {
      for (; LastEmitted != DollarPos; ++LastEmitted)
        switch (AsmString[LastEmitted]) {
        case '\n':
          AddLiteralString("\\n");
          break;
        case '\t':
          AddLiteralString("\\t");
          break;
        case '"':
          AddLiteralString("\\\"");
          break;
        case '\\':
          AddLiteralString("\\\\");
          break;
        default:
          AddLiteralString(std::string(1, AsmString[LastEmitted]));
          break;
        }
    } else if (AsmString[DollarPos] == '\\') {
      if (DollarPos + 1 != AsmString.size()) {
        if (AsmString[DollarPos + 1] == 'n') {
          AddLiteralString("\\n");
        } else if (AsmString[DollarPos + 1] == 't') {
          AddLiteralString("\\t");
        } else if (std::string("${|}\\").find(AsmString[DollarPos + 1]) !=
                   std::string::npos) {
          AddLiteralString(std::string(1, AsmString[DollarPos + 1]));
        } else {
          PrintFatalError(
              CGI.TheDef->getLoc(),
              "Non-supported escaped character found in instruction '" +
                  CGI.getName() + "'!");
        }
        LastEmitted = DollarPos + 2;
        continue;
      }
    } else if (DollarPos + 1 != AsmString.size() &&
               AsmString[DollarPos + 1] == '$') {
      AddLiteralString("$"); // "$$" -> $
      LastEmitted = DollarPos + 2;
    } else {
      // Get the name of the variable.
      std::string::size_type VarEnd = DollarPos + 1;

      // handle ${foo}bar as $foo by detecting whether the character following
      // the dollar sign is a curly brace.  If so, advance VarEnd and DollarPos
      // so the variable name does not contain the leading curly brace.
      bool hasCurlyBraces = false;
      if (VarEnd < AsmString.size() && '{' == AsmString[VarEnd]) {
        hasCurlyBraces = true;
        ++DollarPos;
        ++VarEnd;
      }

      while (VarEnd < AsmString.size() && isIdentChar(AsmString[VarEnd]))
        ++VarEnd;
      StringRef VarName(AsmString.data() + DollarPos + 1,
                        VarEnd - DollarPos - 1);

      // Modifier - Support ${foo:modifier} syntax, where "modifier" is passed
      // into printOperand.  Also support ${:feature}, which is passed into
      // PrintSpecial.
      std::string Modifier;

      // In order to avoid starting the next string at the terminating curly
      // brace, advance the end position past it if we found an opening curly
      // brace.
      if (hasCurlyBraces) {
        if (VarEnd >= AsmString.size())
          PrintFatalError(
              CGI.TheDef->getLoc(),
              "Reached end of string before terminating curly brace in '" +
                  CGI.getName() + "'");

        // Look for a modifier string.
        if (AsmString[VarEnd] == ':') {
          ++VarEnd;
          if (VarEnd >= AsmString.size())
            PrintFatalError(
                CGI.TheDef->getLoc(),
                "Reached end of string before terminating curly brace in '" +
                    CGI.getName() + "'");

          std::string::size_type ModifierStart = VarEnd;
          while (VarEnd < AsmString.size() && isIdentChar(AsmString[VarEnd]))
            ++VarEnd;
          Modifier = AsmString.substr(ModifierStart, VarEnd - ModifierStart);
          if (Modifier.empty())
            PrintFatalError(CGI.TheDef->getLoc(),
                            "Bad operand modifier name in '" + CGI.getName() +
                                "'");
        }

        if (AsmString[VarEnd] != '}')
          PrintFatalError(
              CGI.TheDef->getLoc(),
              "Variable name beginning with '{' did not end with '}' in '" +
                  CGI.getName() + "'");
        ++VarEnd;
      }
      if (VarName.empty() && Modifier.empty())
        PrintFatalError(CGI.TheDef->getLoc(),
                        "Stray '$' in '" + CGI.getName() +
                            "' asm string, maybe you want $$?");

      if (VarName.empty()) {
        // Just a modifier, pass this into PrintSpecial.
        Operands.emplace_back("PrintSpecial", ~0U, Modifier);
      } else {
        // Otherwise, normal operand.
        unsigned OpNo = CGI.Operands.getOperandNamed(VarName);
        CGIOperandList::OperandInfo OpInfo = CGI.Operands[OpNo];

        unsigned MIOp = OpInfo.MIOperandNo;
        Operands.emplace_back(OpInfo.PrinterMethodName.str(), MIOp, Modifier,
                              AsmWriterOperand::isMachineInstrOperand,
                              OpInfo.OperandType == "MCOI::OPERAND_PCREL");
      }
      LastEmitted = VarEnd;
    }
  }

  Operands.emplace_back("return;", AsmWriterOperand::isLiteralStatementOperand);
}

/// MatchesAllButOneOp - If this instruction is exactly identical to the
/// specified instruction except for one differing operand, return the differing
/// operand number.  If more than one operand mismatches, return ~1, otherwise
/// if the instructions are identical return ~0.
unsigned AsmWriterInst::MatchesAllButOneOp(const AsmWriterInst &Other) const {
  if (Operands.size() != Other.Operands.size())
    return ~1;

  unsigned MismatchOperand = ~0U;
  for (unsigned i = 0, e = Operands.size(); i != e; ++i) {
    if (Operands[i] != Other.Operands[i]) {
      if (MismatchOperand != ~0U) // Already have one mismatch?
        return ~1U;
      MismatchOperand = i;
    }
  }
  return MismatchOperand;
}
