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
56 virtual bool optimize(const CompilerOptions &options) const {
57 return options.optimizationLevel > 0;
58 }
59
63 virtual ConstantFoldingPolicy *getConstantFoldingPolicy() const { return nullptr; }
64
68 virtual StrengthReductionPolicy *getStrengthReductionPolicy() const { return nullptr; }
69};
70
71class FrontEnd {
72 FrontEndPolicy *policy;
73 std::vector<DebugHook> hooks;
74
75 public:
76 FrontEnd() : FrontEnd(new FrontEndPolicy()) {}
77 explicit FrontEnd(FrontEndPolicy *policy) : policy(policy), hooks(policy->getDebugHooks()) {}
78
79 void addDebugHook(const DebugHook &hook) { hooks.push_back(hook); }
80 // If p4c is run with option '--listFrontendPasses', outStream is used for printing passes names
81 const IR::P4Program *run(const CompilerOptions &options, const IR::P4Program *program,
82 std::ostream *outStream = nullptr);
83};
84
85} // namespace P4
86
87#endif /* FRONTENDS_P4_FRONTEND_H_ */
Definition frontends/common/options.h:22
Definition constantFolding.h:26
Definition frontends/p4/frontend.h:24
virtual ConstantFoldingPolicy * getConstantFoldingPolicy() const
Definition frontends/p4/frontend.h:63
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:68
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:56
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