//===- polly/LinkAllPasses.h ----------- Reference All Passes ---*- C++ -*-===//
//
//                      The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This header file pulls in all transformation and analysis passes for tools
// like opt and bugpoint that need this functionality.
//
//===----------------------------------------------------------------------===//

#ifndef POLLY_LINKALLPASSES_H
#define POLLY_LINKALLPASSES_H

#include "polly/Config/config.h"
#include <cstdlib>

namespace llvm {
class Pass;
class PassInfo;
class PassRegistry;
class RegionPass;
}

namespace polly {
#ifdef CLOOG_FOUND
llvm::Pass *createCloogExporterPass();
llvm::Pass *createCloogInfoPass();
llvm::Pass *createCodeGenerationPass();
#endif
llvm::Pass *createCodePreparationPass();
llvm::Pass *createDeadCodeElimPass();
llvm::Pass *createDependencesPass();
llvm::Pass *createDOTOnlyPrinterPass();
llvm::Pass *createDOTOnlyViewerPass();
llvm::Pass *createDOTPrinterPass();
llvm::Pass *createDOTViewerPass();
llvm::Pass *createIndependentBlocksPass();
llvm::Pass *createIndVarSimplifyPass();
llvm::Pass *createJSONExporterPass();
llvm::Pass *createJSONImporterPass();
#ifdef PLUTO_FOUND
llvm::Pass *createPlutoOptimizerPass();
#endif
llvm::Pass *createScopDetectionPass();
llvm::Pass *createScopInfoPass();
llvm::Pass *createIslAstInfoPass();
llvm::Pass *createIslCodeGenerationPass();
llvm::Pass *createIslScheduleOptimizerPass();
llvm::Pass *createTempScopInfoPass();

#ifdef OPENSCOP_FOUND
llvm::Pass *createScopExporterPass();
llvm::Pass *createScopImporterPass();
#endif

#ifdef SCOPLIB_FOUND
llvm::Pass *createPoccPass();
llvm::Pass *createScopLibExporterPass();
llvm::Pass *createScopLibImporterPass();
#endif

extern char &IndependentBlocksID;
extern char &CodePreparationID;
}

using namespace polly;

namespace {
struct PollyForcePassLinking {
  PollyForcePassLinking() {
    // We must reference the passes in such a way that compilers will not
    // delete it all as dead code, even with whole program optimization,
    // yet is effectively a NO-OP. As the compiler isn't smart enough
    // to know that getenv() never returns -1, this will do the job.
    if (std::getenv("bar") != (char *)- 1)
      return;

#ifdef CLOOG_FOUND
    createCloogExporterPass();
    createCloogInfoPass();
    createCodeGenerationPass();
#endif
    createCodePreparationPass();
    createDeadCodeElimPass();
    createDependencesPass();
    createDOTOnlyPrinterPass();
    createDOTOnlyViewerPass();
    createDOTPrinterPass();
    createDOTViewerPass();
    createIndependentBlocksPass();
    createIndVarSimplifyPass();
    createJSONExporterPass();
    createJSONImporterPass();
    createScopDetectionPass();
    createScopInfoPass();
#ifdef PLUTO_FOUND
    createPlutoOptimizerPass();
#endif
    createIslAstInfoPass();
    createIslCodeGenerationPass();
    createIslScheduleOptimizerPass();
    createTempScopInfoPass();

#ifdef OPENSCOP_FOUND
    createScopExporterPass();
    createScopImporterPass();
#endif
#ifdef SCOPLIB_FOUND
    createPoccPass();
    createScopLibExporterPass();
    createScopLibImporterPass();
#endif

  }
} PollyForcePassLinking; // Force link by creating a global definition.
}

namespace llvm {
class PassRegistry;
#ifdef CLOOG_FOUND
void initializeCodeGenerationPass(llvm::PassRegistry &);
#endif
void initializeCodePreparationPass(llvm::PassRegistry &);
void initializeDeadCodeElimPass(llvm::PassRegistry &);
void initializeIndependentBlocksPass(llvm::PassRegistry &);
void initializeJSONExporterPass(llvm::PassRegistry &);
void initializeJSONImporterPass(llvm::PassRegistry &);
void initializeIslAstInfoPass(llvm::PassRegistry &);
void initializeIslCodeGenerationPass(llvm::PassRegistry &);
void initializeIslScheduleOptimizerPass(llvm::PassRegistry &);
#ifdef PLUTO_FOUND
void initializePlutoOptimizerPass(llvm::PassRegistry &);
#endif
#ifdef SCOPLIB_FOUND
void initializePoccPass(llvm::PassRegistry &);
#endif
void initializePollyIndVarSimplifyPass(llvm::PassRegistry &);
}

#endif
