void EDEmitter::run(raw_ostream &o) {
    unsigned int i = 0;

    CompoundConstantEmitter infoArray;
    CodeGenTarget target;

    populateInstInfo(infoArray, target);

    o << "InstInfo instInfo" << target.getName().c_str() << "[] = ";
    infoArray.emit(o, i);
    o << ";" << "\n";
}
Пример #2
0
void EmitEnhancedDisassemblerInfo(RecordKeeper &RK, raw_ostream &OS) {
  emitSourceFileHeader("Enhanced Disassembler Info", OS);
  unsigned int i = 0;

  CompoundConstantEmitter infoArray;
  CodeGenTarget target(RK);

  populateInstInfo(infoArray, target);

  emitCommonEnums(OS, i);

  OS << "static const llvm::EDInstInfo instInfo"
     << target.getName() << "[] = ";
  infoArray.emit(OS, i);
  OS << ";" << "\n";
}
Пример #3
0
void EDEmitter::run(raw_ostream &o) {
  unsigned int i = 0;

  CompoundConstantEmitter infoArray;
  CodeGenTarget target(Records);

  populateInstInfo(infoArray, target);

  emitCommonEnums(o, i);

  o << "namespace {\n";

  o << "llvm::EDInstInfo instInfo" << target.getName().c_str() << "[] = ";
  infoArray.emit(o, i);
  o << ";" << "\n";

  o << "}\n";
}
Пример #4
0
/// populateInstInfo - Fills an array of InstInfos with information about each
///   instruction in a target
///
/// \param infoArray The array of InstInfo objects to populate
/// \param target    The CodeGenTarget to use as a source of instructions
static void populateInstInfo(CompoundConstantEmitter &infoArray,
                             CodeGenTarget &target) {
  const std::vector<const CodeGenInstruction*> &numberedInstructions =
    target.getInstructionsByEnumValue();

  unsigned int index;
  unsigned int numInstructions = numberedInstructions.size();

  for (index = 0; index < numInstructions; ++index) {
    const CodeGenInstruction& inst = *numberedInstructions[index];

    CompoundConstantEmitter *infoStruct = new CompoundConstantEmitter;
    infoArray.addEntry(infoStruct);

    LiteralConstantEmitter *instType = new LiteralConstantEmitter;
    infoStruct->addEntry(instType);

    LiteralConstantEmitter *numOperandsEmitter =
      new LiteralConstantEmitter(inst.Operands.size());
    infoStruct->addEntry(numOperandsEmitter);

    CompoundConstantEmitter *operandTypeArray = new CompoundConstantEmitter;
    infoStruct->addEntry(operandTypeArray);

    LiteralConstantEmitter *operandTypes[EDIS_MAX_OPERANDS];

    CompoundConstantEmitter *operandFlagArray = new CompoundConstantEmitter;
    infoStruct->addEntry(operandFlagArray);

    FlagsConstantEmitter *operandFlags[EDIS_MAX_OPERANDS];

    for (unsigned operandIndex = 0;
         operandIndex < EDIS_MAX_OPERANDS;
         ++operandIndex) {
      operandTypes[operandIndex] = new LiteralConstantEmitter;
      operandTypeArray->addEntry(operandTypes[operandIndex]);

      operandFlags[operandIndex] = new FlagsConstantEmitter;
      operandFlagArray->addEntry(operandFlags[operandIndex]);
    }

    unsigned numSyntaxes = 0;

    // We don't need to do anything for pseudo-instructions, as we'll never
    // see them here. We'll only see real instructions.
    // We still need to emit null initializers for everything.
    if (!inst.isPseudo) {
      if (target.getName() == "X86") {
        X86PopulateOperands(operandTypes, inst);
        X86ExtractSemantics(*instType, operandFlags, inst);
        numSyntaxes = 2;
      }
      else if (target.getName() == "ARM") {
        ARMPopulateOperands(operandTypes, inst);
        ARMExtractSemantics(*instType, operandTypes, operandFlags, inst);
        numSyntaxes = 1;
      }
    }

    CompoundConstantEmitter *operandOrderArray = new CompoundConstantEmitter;

    infoStruct->addEntry(operandOrderArray);

    for (unsigned syntaxIndex = 0;
         syntaxIndex < EDIS_MAX_SYNTAXES;
         ++syntaxIndex) {
      CompoundConstantEmitter *operandOrder =
        new CompoundConstantEmitter(EDIS_MAX_OPERANDS);

      operandOrderArray->addEntry(operandOrder);

      if (syntaxIndex < numSyntaxes) {
        populateOperandOrder(operandOrder, inst, syntaxIndex);
      }
    }

    infoStruct = NULL;
  }
}
Пример #5
0
/// populateInstInfo - Fills an array of InstInfos with information about each 
///   instruction in a target
///
/// @arg infoArray  - The array of InstInfo objects to populate
/// @arg target     - The CodeGenTarget to use as a source of instructions
static void populateInstInfo(CompoundConstantEmitter &infoArray,
                             CodeGenTarget &target) {
  const std::vector<const CodeGenInstruction*> &numberedInstructions =
    target.getInstructionsByEnumValue();
  
  unsigned int index;
  unsigned int numInstructions = numberedInstructions.size();
  
  for (index = 0; index < numInstructions; ++index) {
    const CodeGenInstruction& inst = *numberedInstructions[index];
    
    CompoundConstantEmitter *infoStruct = new CompoundConstantEmitter;
    infoArray.addEntry(infoStruct);
    
    LiteralConstantEmitter *instType = new LiteralConstantEmitter;
    infoStruct->addEntry(instType);
    
    LiteralConstantEmitter *numOperandsEmitter = 
      new LiteralConstantEmitter(inst.OperandList.size());
    infoStruct->addEntry(numOperandsEmitter);
    
    CompoundConstantEmitter *operandTypeArray = new CompoundConstantEmitter;
    infoStruct->addEntry(operandTypeArray);
    
    LiteralConstantEmitter *operandTypes[EDIS_MAX_OPERANDS];
                         
    CompoundConstantEmitter *operandFlagArray = new CompoundConstantEmitter;
    infoStruct->addEntry(operandFlagArray);
        
    FlagsConstantEmitter *operandFlags[EDIS_MAX_OPERANDS];
    
    for (unsigned operandIndex = 0; 
         operandIndex < EDIS_MAX_OPERANDS; 
         ++operandIndex) {
      operandTypes[operandIndex] = new LiteralConstantEmitter;
      operandTypeArray->addEntry(operandTypes[operandIndex]);
      
      operandFlags[operandIndex] = new FlagsConstantEmitter;
      operandFlagArray->addEntry(operandFlags[operandIndex]);
    }
 
    unsigned numSyntaxes = 0;
    
    if (target.getName() == "X86") {
      X86PopulateOperands(operandTypes, inst);
      X86ExtractSemantics(*instType, operandFlags, inst);
      numSyntaxes = 2;
    }
    else if (target.getName() == "ARM") {
      ARMPopulateOperands(operandTypes, inst);
      ARMExtractSemantics(*instType, operandTypes, operandFlags, inst);
      numSyntaxes = 1;
    }
    
    CompoundConstantEmitter *operandOrderArray = new CompoundConstantEmitter;    
    
    infoStruct->addEntry(operandOrderArray);
    
    for (unsigned syntaxIndex = 0; 
         syntaxIndex < EDIS_MAX_SYNTAXES; 
         ++syntaxIndex) {
      CompoundConstantEmitter *operandOrder = 
        new CompoundConstantEmitter(EDIS_MAX_OPERANDS);
      
      operandOrderArray->addEntry(operandOrder);
      
      if (syntaxIndex < numSyntaxes) {
        populateOperandOrder(operandOrder, inst, syntaxIndex);
      }
    }
    
    infoStruct = NULL;
  }
}