xref: /openbsd-src/gnu/llvm/clang/tools/clang-fuzzer/cxx_loop_proto.proto (revision e5dd70708596ae51455a0ffa086a00c5b29f8583)
1*e5dd7070Spatrick//===-- cxx_loop_proto.proto - Protobuf description of C++ with for loops -===//
2*e5dd7070Spatrick//
3*e5dd7070Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*e5dd7070Spatrick// See https://llvm.org/LICENSE.txt for license information.
5*e5dd7070Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*e5dd7070Spatrick//
7*e5dd7070Spatrick//===----------------------------------------------------------------------===//
8*e5dd7070Spatrick///
9*e5dd7070Spatrick/// \file
10*e5dd7070Spatrick///  This file describes a subset of C++ as a protobuf. It is used to
11*e5dd7070Spatrick///  more easily find interesting inputs for fuzzing LLVM's vectorizer.
12*e5dd7070Spatrick///  This subset differs from the one defined in cxx_proto.proto by eliminating
13*e5dd7070Spatrick///  while loops and conditionals. The goal is that the C++ code generated will
14*e5dd7070Spatrick///  be more likely to stress the LLVM loop vectorizer. The code generated will
15*e5dd7070Spatrick///  contain either a single loop or two nested loops.
16*e5dd7070Spatrick///
17*e5dd7070Spatrick//===----------------------------------------------------------------------===//
18*e5dd7070Spatrick
19*e5dd7070Spatricksyntax = "proto2";
20*e5dd7070Spatrick
21*e5dd7070Spatrickmessage Const {
22*e5dd7070Spatrick  required int32 val = 1;
23*e5dd7070Spatrick}
24*e5dd7070Spatrick
25*e5dd7070Spatrickmessage VarRef {
26*e5dd7070Spatrick  // Add an enum for each array in function signature
27*e5dd7070Spatrick  enum Arr {
28*e5dd7070Spatrick    ARR_A = 0;
29*e5dd7070Spatrick    ARR_B = 1;
30*e5dd7070Spatrick    ARR_C = 2;
31*e5dd7070Spatrick  };
32*e5dd7070Spatrick  required Arr arr = 1;
33*e5dd7070Spatrick}
34*e5dd7070Spatrick
35*e5dd7070Spatrickmessage BinaryOp {
36*e5dd7070Spatrick  enum Op {
37*e5dd7070Spatrick    PLUS = 0;
38*e5dd7070Spatrick    MINUS = 1;
39*e5dd7070Spatrick    MUL = 2;
40*e5dd7070Spatrick    XOR = 3;
41*e5dd7070Spatrick    AND = 4;
42*e5dd7070Spatrick    OR = 5;
43*e5dd7070Spatrick    EQ = 6;
44*e5dd7070Spatrick    NE = 7;
45*e5dd7070Spatrick    LE = 8;
46*e5dd7070Spatrick    GE = 9;
47*e5dd7070Spatrick    LT = 10;
48*e5dd7070Spatrick    GT = 11;
49*e5dd7070Spatrick  };
50*e5dd7070Spatrick  required Op op = 1;
51*e5dd7070Spatrick  required Rvalue left = 2;
52*e5dd7070Spatrick  required Rvalue right = 3;
53*e5dd7070Spatrick}
54*e5dd7070Spatrick
55*e5dd7070Spatrickmessage Rvalue {
56*e5dd7070Spatrick  oneof rvalue_oneof {
57*e5dd7070Spatrick    Const cons = 1;
58*e5dd7070Spatrick    BinaryOp binop = 2;
59*e5dd7070Spatrick    VarRef varref = 3;
60*e5dd7070Spatrick  }
61*e5dd7070Spatrick}
62*e5dd7070Spatrick
63*e5dd7070Spatrickmessage AssignmentStatement {
64*e5dd7070Spatrick  required VarRef varref = 1;
65*e5dd7070Spatrick  required Rvalue rvalue = 2;
66*e5dd7070Spatrick}
67*e5dd7070Spatrick
68*e5dd7070Spatrickmessage Statement {
69*e5dd7070Spatrick  required AssignmentStatement assignment = 1;
70*e5dd7070Spatrick}
71*e5dd7070Spatrick
72*e5dd7070Spatrickmessage StatementSeq {
73*e5dd7070Spatrick  repeated Statement statements = 1;
74*e5dd7070Spatrick}
75*e5dd7070Spatrick
76*e5dd7070Spatrickmessage LoopFunction {
77*e5dd7070Spatrick  optional StatementSeq inner_statements = 1;
78*e5dd7070Spatrick  required StatementSeq outer_statements = 2;
79*e5dd7070Spatrick}
80*e5dd7070Spatrick
81*e5dd7070Spatrickpackage clang_fuzzer;
82