Skip to content

Commit

Permalink
[flang] add initial Burnside bridge code
Browse files Browse the repository at this point in the history
  • Loading branch information
schweitzpgi committed Oct 2, 2019
1 parent 259364c commit 7d1696b
Show file tree
Hide file tree
Showing 7 changed files with 1,109 additions and 1 deletion.
2 changes: 1 addition & 1 deletion flang/documentation/FortranIR.md
Expand Up @@ -2,7 +2,7 @@

## Introduction

After semantic analysis is complete and it has been determined that the compiler has a legal Fortran program as input, the parse tree will be lowered to an intermediate representation for the purposes of high-level analysis and optimization. In this document, that intermediate representation will be called Fortran IR or FIR.
After semantic analysis is complete and it has been determined that the compiler has a legal Fortran program as input, the parse tree will be lowered to an intermediate representation for the purposes of high-level analysis and optimization. In this document, that intermediate representation will be called Fortran IR or FIR. The pass that converts from the parse tree and other data structures of the front-end to FIR will be called the "Burnside bridge".

FIR will be an explicit, operational, and strongly-typed representation, which shall encapsulate control-flow as graphs.

Expand Down
1 change: 1 addition & 0 deletions flang/lib/CMakeLists.txt
Expand Up @@ -12,6 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.

add_subdirectory(burnside)
add_subdirectory(common)
add_subdirectory(decimal)
add_subdirectory(evaluate)
Expand Down
25 changes: 25 additions & 0 deletions flang/lib/burnside/CMakeLists.txt
@@ -0,0 +1,25 @@
# Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-parameter")

add_library(FortranBurnside
flattened.cc
)

install (TARGETS FortranBurnside
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin
)
78 changes: 78 additions & 0 deletions flang/lib/burnside/builder.h
@@ -0,0 +1,78 @@
// Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef FORTRAN_BURNSIDE_BUILDER_H_
#define FORTRAN_BURNSIDE_BUILDER_H_

#include "../semantics/symbol.h"
#include "llvm/ADT/DenseMap.h"
#include "mlir/IR/Builders.h"
#include "mlir/IR/Function.h"
#include "mlir/IR/Module.h"
#include <string>

namespace llvm {
class StringRef;
}

namespace Fortran::burnside {

/// Miscellaneous helper routines for building MLIR
/// [Coding style](https://llvm.org/docs/CodingStandards.html)

class SymMap {
llvm::DenseMap<const semantics::Symbol *, mlir::Value *> symbolMap;

public:
void addSymbol(const semantics::Symbol *symbol, mlir::Value *value);

mlir::Value *lookupSymbol(const semantics::Symbol *symbol);
};

std::string applyNameMangling(llvm::StringRef parserName);

/// Get the current Module
inline mlir::ModuleOp getModule(mlir::OpBuilder *bldr) {
return bldr->getBlock()->getParent()->getParentOfType<mlir::ModuleOp>();
}

/// Get the current Function
inline mlir::FuncOp getFunction(mlir::OpBuilder *bldr) {
return bldr->getBlock()->getParent()->getParentOfType<mlir::FuncOp>();
}

/// Get the entry block of the current Function
inline mlir::Block *getEntryBlock(mlir::OpBuilder *bldr) {
return &getFunction(bldr).front();
}

/// Create a new basic block
inline mlir::Block *createBlock(mlir::OpBuilder *bldr, mlir::Region *region) {
return bldr->createBlock(region, region->end());
}

inline mlir::Block *createBlock(mlir::OpBuilder *bldr) {
return createBlock(bldr, bldr->getBlock()->getParent());
}

/// Get a function by name (or null)
mlir::FuncOp getNamedFunction(llvm::StringRef name);

/// Create a new Function
mlir::FuncOp createFunction(
mlir::ModuleOp module, llvm::StringRef name, mlir::FunctionType funcTy);

} // Fortran::burnside

#endif // FORTRAN_BURNSIDE_BUILDER_H_

0 comments on commit 7d1696b

Please sign in to comment.