P4C
The P4 Compiler
Loading...
Searching...
No Matches
frontends/p4/frontend.h
1/*
2 * SPDX-FileCopyrightText: 2013 Barefoot Networks, Inc.
3 * Copyright 2013-present Barefoot Networks, Inc.
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8#ifndef FRONTENDS_P4_FRONTEND_H_
9#define FRONTENDS_P4_FRONTEND_H_
10
11#include "../common/options.h"
12#include "ir/ir.h"
13#include "parseAnnotations.h"
14#include "unusedDeclarations.h"
15
16namespace P4 {
17
18class ConstantFoldingPolicy; // forward declare to avoid having to include
19class StrengthReductionPolicy; // forward declare to avoid having to include
20
25 public:
26 virtual ~FrontEndPolicy() = default;
27
31 virtual std::vector<DebugHook> getDebugHooks() const { return {}; }
32
36 virtual ParseAnnotations *getParseAnnotations() const { return nullptr; }
37
41 virtual bool removeOpAssign() const { return true; }
42
45 // TODO: This should probably not be allowed to be skipped at all.
46 virtual bool skipSideEffectOrdering() const { return false; }
47
50 virtual bool foldInlinedFrom() const { return true; }
51
55 virtual bool isStaticAssertFinal() const { return true; }
56
61 virtual bool optimize(const CompilerOptions &options) const {
62 return options.optimizationLevel > 0;
63 }
64
68 virtual ConstantFoldingPolicy *getConstantFoldingPolicy() const { return nullptr; }
69
73 virtual StrengthReductionPolicy *getStrengthReductionPolicy() const { return nullptr; }
74};
75
76class FrontEnd {
77 FrontEndPolicy *policy;
78 std::vector<DebugHook> hooks;
79
80 public:
81 FrontEnd() : FrontEnd(new FrontEndPolicy()) {}
82 explicit FrontEnd(FrontEndPolicy *policy) : policy(policy), hooks(policy->getDebugHooks()) {}
83
84 void addDebugHook(const DebugHook &hook) { hooks.push_back(hook); }
85 // If p4c is run with option '--listFrontendPasses', outStream is used for printing passes names
86 const IR::P4Program *run(const CompilerOptions &options, const IR::P4Program *program,
87 std::ostream *outStream = nullptr);
88};
89
90} // namespace P4
91
92#endif /* FRONTENDS_P4_FRONTEND_H_ */
Definition frontends/common/options.h:22
Definition constantFolding.h:26
Definition frontends/p4/frontend.h:24
virtual bool isStaticAssertFinal() const
Definition frontends/p4/frontend.h:55
virtual ConstantFoldingPolicy * getConstantFoldingPolicy() const
Definition frontends/p4/frontend.h:68
virtual bool skipSideEffectOrdering() const
Definition frontends/p4/frontend.h:46
virtual std::vector< DebugHook > getDebugHooks() const
Definition frontends/p4/frontend.h:31
virtual StrengthReductionPolicy * getStrengthReductionPolicy() const
Definition frontends/p4/frontend.h:73
virtual bool foldInlinedFrom() const
Definition frontends/p4/frontend.h:50
virtual bool removeOpAssign() const
Definition frontends/p4/frontend.h:41
virtual ParseAnnotations * getParseAnnotations() const
Definition frontends/p4/frontend.h:36
virtual bool optimize(const CompilerOptions &options) const
Definition frontends/p4/frontend.h:61
Definition parseAnnotations.h:111
Definition unusedDeclarations.h:39
Definition strengthReduction.h:21
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:13
std::function< void(const char *manager, unsigned seqNo, const char *pass, const IR::Node *node)> DebugHook
Definition ir/pass_manager.h:29