Exemple #1
0
bool LLVMTargetMachine::addAsmPrinter(PassManagerBase &PM,
    raw_pwrite_stream &Out, CodeGenFileType FileType,
    MCContext &Context) {
  if (Options.MCOptions.MCSaveTempLabels)
    Context.setAllowTemporaryLabels(false);

  const MCSubtargetInfo &STI = *getMCSubtargetInfo();
  const MCAsmInfo &MAI = *getMCAsmInfo();
  const MCRegisterInfo &MRI = *getMCRegisterInfo();
  const MCInstrInfo &MII = *getMCInstrInfo();

  std::unique_ptr<MCStreamer> AsmStreamer;

  switch (FileType) {
  case CGFT_AssemblyFile: {
    MCInstPrinter *InstPrinter = getTarget().createMCInstPrinter(
        getTargetTriple(), MAI.getAssemblerDialect(), MAI, MII, MRI);

    // Create a code emitter if asked to show the encoding.
    MCCodeEmitter *MCE = nullptr;
    if (Options.MCOptions.ShowMCEncoding)
      MCE = getTarget().createMCCodeEmitter(MII, MRI, Context);

    MCAsmBackend *MAB =
        getTarget().createMCAsmBackend(STI, MRI, Options.MCOptions);
    auto FOut = llvm::make_unique<formatted_raw_ostream>(Out);
    MCStreamer *S = getTarget().createAsmStreamer(
        Context, std::move(FOut), Options.MCOptions.AsmVerbose,
        Options.MCOptions.MCUseDwarfDirectory, InstPrinter, MCE, MAB,
        Options.MCOptions.ShowMCInst);
    AsmStreamer.reset(S);
    break;
  }
  case CGFT_ObjectFile: {
    // Create the code emitter for the target if it exists.  If not, .o file
    // emission fails.
    MCCodeEmitter *MCE = getTarget().createMCCodeEmitter(MII, MRI, Context);
    MCAsmBackend *MAB =
        getTarget().createMCAsmBackend(STI, MRI, Options.MCOptions);
    if (!MCE || !MAB)
      return true;

    // Don't waste memory on names of temp labels.
    Context.setUseNamesOnTempLabels(false);

    Triple T(getTargetTriple().str());
    AsmStreamer.reset(getTarget().createMCObjectStreamer(
        T, Context, std::unique_ptr<MCAsmBackend>(MAB), Out,
        std::unique_ptr<MCCodeEmitter>(MCE), STI, Options.MCOptions.MCRelaxAll,
        Options.MCOptions.MCIncrementalLinkerCompatible,
        /*DWARFMustBeAtTheEnd*/ true));
    break;
  }
  case CGFT_Null:
    // The Null output is intended for use for performance analysis and testing,
    // not real users.
    AsmStreamer.reset(getTarget().createNullStreamer(Context));
    break;
  }

  // Create the AsmPrinter, which takes ownership of AsmStreamer if successful.
  FunctionPass *Printer =
      getTarget().createAsmPrinter(*this, std::move(AsmStreamer));
  if (!Printer)
    return true;

  PM.add(Printer);
  return false;
}
Exemple #2
0
bool LLVMTargetMachine::addPassesToEmitFile(
    PassManagerBase &PM, raw_pwrite_stream &Out, CodeGenFileType FileType,
    bool DisableVerify, AnalysisID StartBefore, AnalysisID StartAfter,
    AnalysisID StopAfter, MachineFunctionInitializer *MFInitializer) {
    // Add common CodeGen passes.
    MCContext *Context =
        addPassesToGenerateCode(this, PM, DisableVerify, StartBefore, StartAfter,
                                StopAfter, MFInitializer);
    if (!Context)
        return true;

    if (StopAfter) {
        PM.add(createPrintMIRPass(outs()));
        return false;
    }

    if (Options.MCOptions.MCSaveTempLabels)
        Context->setAllowTemporaryLabels(false);

    const MCSubtargetInfo &STI = *getMCSubtargetInfo();
    const MCAsmInfo &MAI = *getMCAsmInfo();
    const MCRegisterInfo &MRI = *getMCRegisterInfo();
    const MCInstrInfo &MII = *getMCInstrInfo();

    std::unique_ptr<MCStreamer> AsmStreamer;

    switch (FileType) {
    case CGFT_AssemblyFile: {
        MCInstPrinter *InstPrinter = getTarget().createMCInstPrinter(
                                         getTargetTriple(), MAI.getAssemblerDialect(), MAI, MII, MRI);

        // Create a code emitter if asked to show the encoding.
        MCCodeEmitter *MCE = nullptr;
        if (Options.MCOptions.ShowMCEncoding)
            MCE = getTarget().createMCCodeEmitter(MII, MRI, *Context);

        MCAsmBackend *MAB =
            getTarget().createMCAsmBackend(MRI, getTargetTriple().str(), TargetCPU);
        auto FOut = llvm::make_unique<formatted_raw_ostream>(Out);
        MCStreamer *S = getTarget().createAsmStreamer(
                            *Context, std::move(FOut), Options.MCOptions.AsmVerbose,
                            Options.MCOptions.MCUseDwarfDirectory, InstPrinter, MCE, MAB,
                            Options.MCOptions.ShowMCInst);
        AsmStreamer.reset(S);
        break;
    }
    case CGFT_ObjectFile: {
        // Create the code emitter for the target if it exists.  If not, .o file
        // emission fails.
        MCCodeEmitter *MCE = getTarget().createMCCodeEmitter(MII, MRI, *Context);
        MCAsmBackend *MAB =
            getTarget().createMCAsmBackend(MRI, getTargetTriple().str(), TargetCPU);
        if (!MCE || !MAB)
            return true;

        // Don't waste memory on names of temp labels.
        Context->setUseNamesOnTempLabels(false);

        Triple T(getTargetTriple().str());
        AsmStreamer.reset(getTarget().createMCObjectStreamer(
                              T, *Context, *MAB, Out, MCE, STI, Options.MCOptions.MCRelaxAll,
                              /*DWARFMustBeAtTheEnd*/ true));
        break;
    }
    case CGFT_Null:
        // The Null output is intended for use for performance analysis and testing,
        // not real users.
        AsmStreamer.reset(getTarget().createNullStreamer(*Context));
        break;
    }

    // Create the AsmPrinter, which takes ownership of AsmStreamer if successful.
    FunctionPass *Printer =
        getTarget().createAsmPrinter(*this, std::move(AsmStreamer));
    if (!Printer)
        return true;

    PM.add(Printer);

    return false;
}