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