1//===- TBAAForest.cpp - Per-functon TBAA Trees ----------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "flang/Optimizer/Analysis/TBAAForest.h"
10#include <mlir/Dialect/LLVMIR/LLVMAttrs.h>
11
12mlir::LLVM::TBAATagAttr
13fir::TBAATree::SubtreeState::getTag(llvm::StringRef uniqueName) const {
14 std::string id = (parentId + "/" + uniqueName).str();
15 mlir::LLVM::TBAATypeDescriptorAttr type =
16 mlir::LLVM::TBAATypeDescriptorAttr::get(
17 context, id, mlir::LLVM::TBAAMemberAttr::get(parent, 0));
18 return mlir::LLVM::TBAATagAttr::get(type, type, 0);
19 // return tag;
20}
21
22mlir::LLVM::TBAATagAttr fir::TBAATree::SubtreeState::getTag() const {
23 return mlir::LLVM::TBAATagAttr::get(parent, parent, 0);
24}
25
26fir::TBAATree fir::TBAATree::buildTree(mlir::StringAttr func) {
27 llvm::StringRef funcName = func.getValue();
28 std::string rootId = ("Flang function root " + funcName).str();
29 mlir::MLIRContext *ctx = func.getContext();
30 mlir::LLVM::TBAARootAttr funcRoot =
31 mlir::LLVM::TBAARootAttr::get(ctx, mlir::StringAttr::get(ctx, rootId));
32
33 static constexpr llvm::StringRef anyAccessTypeDescId = "any access";
34 mlir::LLVM::TBAATypeDescriptorAttr anyAccess =
35 mlir::LLVM::TBAATypeDescriptorAttr::get(
36 ctx, anyAccessTypeDescId,
37 mlir::LLVM::TBAAMemberAttr::get(funcRoot, 0));
38
39 static constexpr llvm::StringRef anyDataAccessTypeDescId = "any data access";
40 mlir::LLVM::TBAATypeDescriptorAttr dataRoot =
41 mlir::LLVM::TBAATypeDescriptorAttr::get(
42 ctx, anyDataAccessTypeDescId,
43 mlir::LLVM::TBAAMemberAttr::get(anyAccess, 0));
44
45 static constexpr llvm::StringRef boxMemberTypeDescId = "descriptor member";
46 mlir::LLVM::TBAATypeDescriptorAttr boxMemberTypeDesc =
47 mlir::LLVM::TBAATypeDescriptorAttr::get(
48 ctx, boxMemberTypeDescId,
49 mlir::LLVM::TBAAMemberAttr::get(anyAccess, 0));
50
51 return TBAATree{anyAccess, dataRoot, boxMemberTypeDesc};
52}
53
54fir::TBAATree::TBAATree(mlir::LLVM::TBAATypeDescriptorAttr anyAccess,
55 mlir::LLVM::TBAATypeDescriptorAttr dataRoot,
56 mlir::LLVM::TBAATypeDescriptorAttr boxMemberTypeDesc)
57 : targetDataTree(dataRoot.getContext(), "target data", dataRoot),
58 globalDataTree(dataRoot.getContext(), "global data",
59 targetDataTree.getRoot()),
60 allocatedDataTree(dataRoot.getContext(), "allocated data",
61 targetDataTree.getRoot()),
62 dummyArgDataTree(dataRoot.getContext(), "dummy arg data", dataRoot),
63 directDataTree(dataRoot.getContext(), "direct data",
64 targetDataTree.getRoot()),
65 anyAccessDesc(anyAccess), boxMemberTypeDesc(boxMemberTypeDesc),
66 anyDataTypeDesc(dataRoot) {}
67

source code of flang/lib/Optimizer/Analysis/TBAAForest.cpp