blob: 1f91aced0016a237ee55bf07345f1fab0f3f7888 [file] [log] [blame]
//===-- go-llvm-genblocks.h - decls for GenBlocks class --------------------===//
//
// 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.
//
//===----------------------------------------------------------------------===//
//
// Defines GenBlockVisitor class and related helper routines.
//
//===----------------------------------------------------------------------===//
#ifndef LLVMGOFRONTEND_GO_LLVM_GENBLOCKS_H
#define LLVMGOFRONTEND_GO_LLVM_GENBLOCKS_H
#include <string>
#include <vector>
#include "go-llvm-bstatement.h"
#include "namegen.h"
namespace llvm {
class Instruction;
class BasicBlock;
class LLVMContext;
}
class Bexpression;
class Bfunction;
class Llvm_backend;
//
// Helper class for assigning instructions to LLVM basic blocks
// and materializing control transfers.
//
class GenBlocksVisitor {
public:
GenBlocksVisitor(llvm::LLVMContext &context,
Llvm_backend *be, Bfunction *function)
: context_(context), be_(be), function_(function),
emitOrphanedCode_(false) {}
Bfunction *function() { return function_; }
void visitNodePre(Bnode *node) { } // to be filled in
void visitNodePost(Bnode *node) { } // to be filled in
private:
llvm::BasicBlock *mkLLVMBlock(const std::string &name,
unsigned expl = NameGen::ChooseVer);
llvm::BasicBlock *getBlockForLabel(LabelId lab);
private:
llvm::LLVMContext &context_;
Llvm_backend *be_;
Bfunction *function_;
std::map<LabelId, llvm::BasicBlock *> labelmap_;
std::vector<llvm::BasicBlock *> blockstack_;
bool emitOrphanedCode_;
};
// This entry point walks the specified Bnode tree and assigns
// its containing LLVM instructions to blocks.
extern llvm::BasicBlock *genblocks(llvm::LLVMContext &context,
Llvm_backend *be,
Bfunction *func,
Bstatement *code_stmt);
#endif // LLVMGOFRONTEND_GO_LLVM_GENBLOCKS_H