Skip to content

Commit

Permalink
@command_line annotation
Browse files Browse the repository at this point in the history
- per-target selectable support, though most should want it

Signed-off-by: Chris Dodd <cdodd@nvidia.com>
  • Loading branch information
ChrisDodd committed Feb 12, 2025
1 parent c67d1fd commit bfb4f08
Show file tree
Hide file tree
Showing 14 changed files with 36 additions and 10 deletions.
2 changes: 1 addition & 1 deletion backends/bmv2/pna_nic/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ int main(int argc, char *const argv[]) {

if (program == nullptr || ::P4::errorCount() > 0) return 1;
try {
P4::P4COptionPragmaParser optionsPragmaParser;
P4::P4COptionPragmaParser optionsPragmaParser(true);
program->apply(P4::ApplyOptionsPragmas(optionsPragmaParser));

P4::FrontEnd frontend;
Expand Down
2 changes: 1 addition & 1 deletion backends/bmv2/psa_switch/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ int main(int argc, char *const argv[]) {

if (program == nullptr || ::P4::errorCount() > 0) return 1;
try {
P4::P4COptionPragmaParser optionsPragmaParser;
P4::P4COptionPragmaParser optionsPragmaParser(true);
program->apply(P4::ApplyOptionsPragmas(optionsPragmaParser));

P4::FrontEnd frontend;
Expand Down
2 changes: 1 addition & 1 deletion backends/bmv2/simple_switch/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ int main(int argc, char *const argv[]) {

if (program == nullptr || ::P4::errorCount() > 0) return 1;
try {
P4::P4COptionPragmaParser optionsPragmaParser;
P4::P4COptionPragmaParser optionsPragmaParser(true);
program->apply(P4::ApplyOptionsPragmas(optionsPragmaParser));

P4::FrontEnd frontend;
Expand Down
2 changes: 1 addition & 1 deletion backends/dpdk/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ int main(int argc, char *const argv[]) {

if (program == nullptr || ::P4::errorCount() > 0) return 1;
try {
P4::P4COptionPragmaParser optionsPragmaParser;
P4::P4COptionPragmaParser optionsPragmaParser(true);
program->apply(P4::ApplyOptionsPragmas(optionsPragmaParser));

P4::FrontEnd frontend;
Expand Down
2 changes: 1 addition & 1 deletion backends/ebpf/p4c-ebpf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ void compile(EbpfOptions &options) {
program = P4::parseP4File(options);
if (::P4::errorCount() > 0) return;

P4::P4COptionPragmaParser optionsPragmaParser;
P4::P4COptionPragmaParser optionsPragmaParser(true);
program->apply(P4::ApplyOptionsPragmas(optionsPragmaParser));

P4::FrontEnd frontend;
Expand Down
2 changes: 1 addition & 1 deletion backends/graphs/p4c-graphs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ int main(int argc, char *const argv[]) {
if (program == nullptr || ::P4::errorCount() > 0) return 1;

try {
P4::P4COptionPragmaParser optionsPragmaParser;
P4::P4COptionPragmaParser optionsPragmaParser(false);
program->apply(P4::ApplyOptionsPragmas(optionsPragmaParser));

P4::FrontEnd fe;
Expand Down
2 changes: 1 addition & 1 deletion backends/p4test/p4test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ int main(int argc, char *const argv[]) {
info.emitInfo("PARSER");

if (program != nullptr && ::P4::errorCount() == 0) {
P4::P4COptionPragmaParser optionsPragmaParser;
P4::P4COptionPragmaParser optionsPragmaParser(true);
program->apply(P4::ApplyOptionsPragmas(optionsPragmaParser));
info.emitInfo("PASS P4COptionPragmaParser");

Expand Down
2 changes: 1 addition & 1 deletion backends/p4tools/common/compiler/compiler_target.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ const IR::P4Program *CompilerTarget::runParser(const ParserOptions &options) {

const IR::P4Program *CompilerTarget::runFrontend(const CompilerOptions &options,
const IR::P4Program *program) const {
P4COptionPragmaParser optionsPragmaParser;
P4COptionPragmaParser optionsPragmaParser(false);
program->apply(ApplyOptionsPragmas(optionsPragmaParser));

auto frontEnd = mkFrontEnd();
Expand Down
2 changes: 1 addition & 1 deletion backends/tc/tc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ int main(int argc, char *const argv[]) {
return 1;
}
try {
P4::P4COptionPragmaParser optionsPragmaParser;
P4::P4COptionPragmaParser optionsPragmaParser(true);
program->apply(P4::ApplyOptionsPragmas(optionsPragmaParser));
P4::FrontEnd frontend;
frontend.addDebugHook(hook);
Expand Down
3 changes: 3 additions & 0 deletions backends/tofino/bf-p4c/bf-p4c-options.h
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,9 @@ class BFNOptionPragmaParser : public P4::P4COptionPragmaParser {
public:
std::optional<CommandLineOptions> tryToParse(const IR::Annotation *annotation) override;

BFNOptionPragmaParser() : P4::P4COptionPragmaParser(false) {}
// FIXME -- should remove the tofino @command_line stuff and use the base class

private:
std::optional<CommandLineOptions> parseCompilerOption(const IR::Annotation *annotation);
};
Expand Down
16 changes: 16 additions & 0 deletions frontends/common/applyOptionsPragmas.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,22 @@ std::optional<IOptionPragmaParser::CommandLineOptions> P4COptionPragmaParser::tr
const IR::Annotation *annotation) {
auto pragmaName = annotation->name.name;
if (pragmaName == "diagnostic") return parseDiagnostic(annotation);
if (supportCommandLinePragma && pragmaName == "command_line") {
IOptionPragmaParser::CommandLineOptions options;
auto *args = annotation->needsParsing()
? P4ParserDriver::parseExpressionList(annotation->srcInfo,
annotation->getUnparsed())
: &annotation->getExpr();
for (auto *arg : *args) {
if (auto *a = arg->to<IR::StringLiteral>()) {
options.push_back(a->value.c_str());
} else {
// can this happen? annotation parser should require only strings
warning("ignoring non-string %1% in @command_line", a);
}
}
return options;
}
return std::nullopt;
}

Expand Down
4 changes: 4 additions & 0 deletions frontends/common/applyOptionsPragmas.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,13 @@ class ApplyOptionsPragmas : public Inspector {
* they're unable to parse a pragma.
*/
class P4COptionPragmaParser : public IOptionPragmaParser {
bool supportCommandLinePragma;

public:
std::optional<CommandLineOptions> tryToParse(const IR::Annotation *annotation) override;

explicit P4COptionPragmaParser(bool sCLP) : supportCommandLinePragma(sCLP) {}

private:
std::optional<CommandLineOptions> parseDiagnostic(const IR::Annotation *annotation);
};
Expand Down
3 changes: 3 additions & 0 deletions frontends/p4/parseAnnotations.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@ ParseAnnotations::HandlerMap ParseAnnotations::standardHandlers() {

// @match has an expression argument
PARSE(IR::Annotation::matchAnnotation, Expression),

// @command_line to add to the command line
PARSE_STRING_LITERAL_LIST("command_line"_cs),
};
}

Expand Down
2 changes: 1 addition & 1 deletion test/gtest/helpers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ namespace P4::Test {
return std::nullopt;
}

P4::P4COptionPragmaParser optionsPragmaParser;
P4::P4COptionPragmaParser optionsPragmaParser(true);
program->apply(P4::ApplyOptionsPragmas(optionsPragmaParser));
if (::P4::errorCount() > 0) {
std::cerr << "Encountered " << ::P4::errorCount()
Expand Down

0 comments on commit bfb4f08

Please sign in to comment.