//===--- GollvmPasses.h - Gollvm specific backend passes ------------------===//
//
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_GOLLVM_PASSES_GOLLVMPASSES_H
#define LLVM_GOLLVM_PASSES_GOLLVMPASSES_H

#include "llvm/ADT/SmallVector.h"

namespace llvm {

class DataLayout;
class FunctionPass;
class ModulePass;
class PassRegistry;
class Type;
class Value;

void initializeGoAnnotationPass(PassRegistry&);
void initializeGoNilChecksPass(PassRegistry&);
void initializeGoSafeGetgPass(PassRegistry&);
void initializeGoStatepointsLegacyPassPass(PassRegistry&);
void initializeGoWrappersPass(PassRegistry&);
void initializeRemoveAddrSpacePassPass(PassRegistry&);

FunctionPass *createGoAnnotationPass();
FunctionPass *createGoNilChecksPass();
ModulePass *createGoSafeGetgPass();
ModulePass *createGoStatepointsLegacyPass();
FunctionPass *createGoWrappersPass();
ModulePass *createRemoveAddrSpacePass(const DataLayout&);

void linkGoGC();
void linkGoGCPrinter();

} // namespace llvm

namespace gollvm {
namespace passes {

// Helper functions.

// Whether a type contains pointer.
bool hasPointer(llvm::Type *);

// Compute the pointer bitmap for type T, stored into Words.
void getPtrBitmapForType(llvm::Type *T, const llvm::DataLayout &DL,
                         llvm::SmallVectorImpl<llvm::Value *> &Words);

} // namespace passes
} // namespace gollvm

#endif
