xref: /openbsd-src/gnu/llvm/clang/tools/clang-fuzzer/cxx_proto.proto (revision e5dd70708596ae51455a0ffa086a00c5b29f8583)
1*e5dd7070Spatrick//===-- cxx_proto.proto - Protobuf description of C++ ---------------------===//
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 Clang.
12*e5dd7070Spatrick///
13*e5dd7070Spatrick//===----------------------------------------------------------------------===//
14*e5dd7070Spatrick
15*e5dd7070Spatricksyntax = "proto2";
16*e5dd7070Spatrick
17*e5dd7070Spatrickmessage VarRef {
18*e5dd7070Spatrick  required int32 varnum = 1;
19*e5dd7070Spatrick}
20*e5dd7070Spatrick
21*e5dd7070Spatrickmessage Lvalue {
22*e5dd7070Spatrick  required VarRef varref = 1;
23*e5dd7070Spatrick}
24*e5dd7070Spatrick
25*e5dd7070Spatrickmessage Const {
26*e5dd7070Spatrick  required int32 val = 1;
27*e5dd7070Spatrick}
28*e5dd7070Spatrick
29*e5dd7070Spatrickmessage BinaryOp {
30*e5dd7070Spatrick  enum Op {
31*e5dd7070Spatrick    PLUS = 0;
32*e5dd7070Spatrick    MINUS = 1;
33*e5dd7070Spatrick    MUL = 2;
34*e5dd7070Spatrick    DIV = 3;
35*e5dd7070Spatrick    MOD = 4;
36*e5dd7070Spatrick    XOR = 5;
37*e5dd7070Spatrick    AND = 6;
38*e5dd7070Spatrick    OR = 7;
39*e5dd7070Spatrick    EQ = 8;
40*e5dd7070Spatrick    NE = 9;
41*e5dd7070Spatrick    LE = 10;
42*e5dd7070Spatrick    GE = 11;
43*e5dd7070Spatrick    LT = 12;
44*e5dd7070Spatrick    GT = 13;
45*e5dd7070Spatrick  };
46*e5dd7070Spatrick  required Op op = 1;
47*e5dd7070Spatrick  required Rvalue left = 2;
48*e5dd7070Spatrick  required Rvalue right = 3;
49*e5dd7070Spatrick}
50*e5dd7070Spatrick
51*e5dd7070Spatrickmessage Rvalue {
52*e5dd7070Spatrick  oneof rvalue_oneof {
53*e5dd7070Spatrick    VarRef varref = 1;
54*e5dd7070Spatrick    Const cons = 2;
55*e5dd7070Spatrick    BinaryOp binop = 3;
56*e5dd7070Spatrick  }
57*e5dd7070Spatrick}
58*e5dd7070Spatrick
59*e5dd7070Spatrickmessage AssignmentStatement {
60*e5dd7070Spatrick  required Lvalue lvalue = 1;
61*e5dd7070Spatrick  required Rvalue rvalue = 2;
62*e5dd7070Spatrick}
63*e5dd7070Spatrick
64*e5dd7070Spatrick
65*e5dd7070Spatrickmessage IfElse {
66*e5dd7070Spatrick  required Rvalue cond = 1;
67*e5dd7070Spatrick  required StatementSeq if_body = 2;
68*e5dd7070Spatrick  required StatementSeq else_body = 3;
69*e5dd7070Spatrick}
70*e5dd7070Spatrick
71*e5dd7070Spatrickmessage While {
72*e5dd7070Spatrick  required Rvalue cond = 1;
73*e5dd7070Spatrick  required StatementSeq body = 2;
74*e5dd7070Spatrick}
75*e5dd7070Spatrick
76*e5dd7070Spatrickmessage Statement {
77*e5dd7070Spatrick  oneof stmt_oneof {
78*e5dd7070Spatrick    AssignmentStatement assignment = 1;
79*e5dd7070Spatrick    IfElse              ifelse     = 2;
80*e5dd7070Spatrick    While               while_loop = 3;
81*e5dd7070Spatrick  }
82*e5dd7070Spatrick}
83*e5dd7070Spatrick
84*e5dd7070Spatrickmessage StatementSeq {
85*e5dd7070Spatrick  repeated Statement statements = 1;
86*e5dd7070Spatrick}
87*e5dd7070Spatrick
88*e5dd7070Spatrickmessage Function {
89*e5dd7070Spatrick  required StatementSeq statements = 1;
90*e5dd7070Spatrick}
91*e5dd7070Spatrick
92*e5dd7070Spatrickpackage clang_fuzzer;
93