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