/* This program is part of the TACLeBench benchmark suite. Version 2.0 Name: cover Author: unknown Function: A program for testing many paths generated by switch-case statements. Source: MRTC http://www.mrtc.mdh.se/projects/wcet/wcet_bench/cover/cover.c Original name: cover Changes: See ChangeLog.txt License: may be used, modified, and re-distributed freely */ /* Forward declaration of functions */ // Wasm loop bounds __attribute__((import_module("__pragma"), import_name("loopbound"))) extern void __pragma_loopbound(unsigned int min_bound, unsigned int max_bound); void cover_init(void); __attribute__((noinline)) __attribute__((export_name("entrypoint"))) void cover_main(void); int cover_return(void); int cover_swi10(int); int cover_swi50(int); int cover_swi120(int); /* Declaration of global variables */ static volatile int cover_cnt; /* Initialization- and return-value-related functions */ void cover_init(void) { cover_cnt = 0; } int cover_return(void) { return cover_cnt - 180; } /* Core benchmark functions */ int cover_swi120(int c) { int i; __pragma_loopbound(120, 120); for (i = 0; i < 120; i++) { switch (i) { case 0: c++; break; case 1: c++; break; case 2: c++; break; case 3: c++; break; case 4: c++; break; case 5: c++; break; case 6: c++; break; case 7: c++; break; case 8: c++; break; case 9: c++; break; case 10: c++; break; case 11: c++; break; case 12: c++; break; case 13: c++; break; case 14: c++; break; case 15: c++; break; case 16: c++; break; case 17: c++; break; case 18: c++; break; case 19: c++; break; case 20: c++; break; case 21: c++; break; case 22: c++; break; case 23: c++; break; case 24: c++; break; case 25: c++; break; case 26: c++; break; case 27: c++; break; case 28: c++; break; case 29: c++; break; case 30: c++; break; case 31: c++; break; case 32: c++; break; case 33: c++; break; case 34: c++; break; case 35: c++; break; case 36: c++; break; case 37: c++; break; case 38: c++; break; case 39: c++; break; case 40: c++; break; case 41: c++; break; case 42: c++; break; case 43: c++; break; case 44: c++; break; case 45: c++; break; case 46: c++; break; case 47: c++; break; case 48: c++; break; case 49: c++; break; case 50: c++; break; case 51: c++; break; case 52: c++; break; case 53: c++; break; case 54: c++; break; case 55: c++; break; case 56: c++; break; case 57: c++; break; case 58: c++; break; case 59: c++; break; case 60: c++; break; case 61: c++; break; case 62: c++; break; case 63: c++; break; case 64: c++; break; case 65: c++; break; case 66: c++; break; case 67: c++; break; case 68: c++; break; case 69: c++; break; case 70: c++; break; case 71: c++; break; case 72: c++; break; case 73: c++; break; case 74: c++; break; case 75: c++; break; case 76: c++; break; case 77: c++; break; case 78: c++; break; case 79: c++; break; case 80: c++; break; case 81: c++; break; case 82: c++; break; case 83: c++; break; case 84: c++; break; case 85: c++; break; case 86: c++; break; case 87: c++; break; case 88: c++; break; case 89: c++; break; case 90: c++; break; case 91: c++; break; case 92: c++; break; case 93: c++; break; case 94: c++; break; case 95: c++; break; case 96: c++; break; case 97: c++; break; case 98: c++; break; case 99: c++; break; case 100: c++; break; case 101: c++; break; case 102: c++; break; case 103: c++; break; case 104: c++; break; case 105: c++; break; case 106: c++; break; case 107: c++; break; case 108: c++; break; case 109: c++; break; case 110: c++; break; case 111: c++; break; case 112: c++; break; case 113: c++; break; case 114: c++; break; case 115: c++; break; case 116: c++; break; case 117: c++; break; case 118: c++; break; case 119: c++; break; default: c--; break; } } return c; } int cover_swi50(int c) { int i; __pragma_loopbound(50, 50); for (i = 0; i < 50; i++) { switch (i) { case 0: c++; break; case 1: c++; break; case 2: c++; break; case 3: c++; break; case 4: c++; break; case 5: c++; break; case 6: c++; break; case 7: c++; break; case 8: c++; break; case 9: c++; break; case 10: c++; break; case 11: c++; break; case 12: c++; break; case 13: c++; break; case 14: c++; break; case 15: c++; break; case 16: c++; break; case 17: c++; break; case 18: c++; break; case 19: c++; break; case 20: c++; break; case 21: c++; break; case 22: c++; break; case 23: c++; break; case 24: c++; break; case 25: c++; break; case 26: c++; break; case 27: c++; break; case 28: c++; break; case 29: c++; break; case 30: c++; break; case 31: c++; break; case 32: c++; break; case 33: c++; break; case 34: c++; break; case 35: c++; break; case 36: c++; break; case 37: c++; break; case 38: c++; break; case 39: c++; break; case 40: c++; break; case 41: c++; break; case 42: c++; break; case 43: c++; break; case 44: c++; break; case 45: c++; break; case 46: c++; break; case 47: c++; break; case 48: c++; break; case 49: c++; break; case 50: c++; break; case 51: c++; break; case 52: c++; break; case 53: c++; break; case 54: c++; break; case 55: c++; break; case 56: c++; break; case 57: c++; break; case 58: c++; break; case 59: c++; break; default: c--; break; } } return c; } int cover_swi10(int c) { int i; __pragma_loopbound(10, 10); for (i = 0; i < 10; i++) { switch (i) { case 0: c++; break; case 1: c++; break; case 2: c++; break; case 3: c++; break; case 4: c++; break; case 5: c++; break; case 6: c++; break; case 7: c++; break; case 8: c++; break; case 9: c++; break; default: c--; break; } } return c; } __attribute__((noinline)) __attribute__((export_name("entrypoint"))) void cover_main(void) { cover_cnt = cover_swi10(cover_cnt); cover_cnt = cover_swi50(cover_cnt); cover_cnt = cover_swi120(cover_cnt); } /* Main function */ __attribute__((noinline)) __attribute__((export_name("main"))) int main(void) { cover_init(); cover_main(); return cover_return(); }