warn-unregistered.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. /* GCC-StarPU
  2. Copyright (C) 2012 Institut National de Recherche en Informatique et Automatique
  3. GCC-StarPU is free software: you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation, either version 3 of the License, or
  6. (at your option) any later version.
  7. GCC-StarPU is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with GCC-StarPU. If not, see <http://www.gnu.org/licenses/>. */
  13. /* (instructions compile) */
  14. /* Make sure warnings get raised when pointer variables are likely never
  15. registered. */
  16. extern void my_task (double *x, double *y)
  17. __attribute__ ((task));
  18. extern double *global1;
  19. double global2[123];
  20. void
  21. parm_decl_no_warn (double *parm1, double *parm2)
  22. {
  23. my_task (parm1, parm2); /* no warning, because these are parameters
  24. so we cannot tell anything */
  25. }
  26. void
  27. global_decl_no_warn (void)
  28. {
  29. my_task (global1, global2);
  30. }
  31. void
  32. two_unregistered_pointers (void)
  33. {
  34. double *p, *q;
  35. p = malloc (12 * sizeof *p);
  36. q = malloc (23 * sizeof *q);
  37. my_task (p, q); /* (warning "p.* used unregistered") *//* (warning "q.* used unregistered") */
  38. }
  39. void
  40. one_unregistered_pointer (void)
  41. {
  42. double *p, *q;
  43. p = malloc (12 * sizeof *p);
  44. q = malloc (23 * sizeof *q);
  45. #pragma starpu register p 12
  46. my_task (p, q); /* (if optimizing?
  47. (warning "q.* used unregistered")) */
  48. }
  49. void
  50. another_unregistered_pointer (void)
  51. {
  52. double X[] = { 1, 2, 3, 4 };
  53. double *Y;
  54. Y = malloc (123 * sizeof *Y);
  55. if (Y == NULL)
  56. return;
  57. else
  58. {
  59. extern void frob (double *);
  60. frob (Y);
  61. }
  62. X[0] = 42;
  63. #pragma starpu register Y 123
  64. my_task (X, Y); /* (warning "X.* used unregistered") */
  65. }
  66. void
  67. zero_unregistered_pointers (void)
  68. {
  69. double *p, *q;
  70. p = malloc (12 * sizeof *p);
  71. q = malloc (23 * sizeof *q);
  72. #pragma starpu register p 12
  73. #pragma starpu register q 23
  74. my_task (p, q); /* no warning */
  75. }
  76. void
  77. two_pointers_unregistered_before_call (void)
  78. {
  79. double *p, *q;
  80. p = malloc (12 * sizeof *p);
  81. q = malloc (23 * sizeof *q);
  82. my_task (p, q); /* (warning "p.* used unregistered") *//* (warning "q.* used unregistered") */
  83. #pragma starpu register p 12
  84. #pragma starpu register q 23
  85. }
  86. void
  87. one_unregistered_array (void)
  88. {
  89. double PPP[12], QQQ[23];
  90. #pragma starpu register PPP /* (warning "on-stack .* unsafe") */
  91. my_task (PPP, QQQ); /* (warning "QQQ.* used unregistered") */
  92. }
  93. void
  94. not_the_ones_registered (void)
  95. {
  96. double a[12], b[23], p[12], q[23];
  97. #pragma starpu register a /* (warning "on-stack .* unsafe") */
  98. #pragma starpu register b /* (warning "on-stack .* unsafe") */
  99. my_task (p, q); /* (warning "p.* used unregistered") */ /* (warning "q.* used unregistered") */
  100. }
  101. void
  102. registered_pointers_with_aliases (void)
  103. {
  104. double *a, *b, *p, *q;
  105. a = malloc (123 * sizeof *a);
  106. b = malloc (234 * sizeof *b);
  107. #pragma starpu register a 123
  108. #pragma starpu register b 234
  109. p = a;
  110. q = b;
  111. my_task (p, q); /* no warning */
  112. }
  113. void
  114. one_unregistered_array_attrs (void)
  115. {
  116. double p[12];
  117. double q[23] __attribute__ ((heap_allocated, registered));
  118. my_task (p, q); /* (warning "p.* used unregistered") */
  119. }
  120. void
  121. unregistered_on_one_path (int x)
  122. {
  123. double p[12], q[34];
  124. if (x > 42)
  125. {
  126. #pragma starpu register p /* (warning "on-stack .* unsafe") */
  127. }
  128. #pragma starpu register q /* (warning "on-stack .* unsafe") */
  129. my_task (p, q); /* (warning "p.* used unregistered") */
  130. }
  131. void
  132. registered_via_two_paths (int x)
  133. {
  134. double p[12], q[34];
  135. if (x > 42)
  136. {
  137. #pragma starpu register p /* (warning "on-stack .* unsafe") */
  138. }
  139. else
  140. {
  141. #pragma starpu register p /* (warning "on-stack .* unsafe") */
  142. }
  143. #pragma starpu register q /* (warning "on-stack .* unsafe") */
  144. my_task (p, q); /* no warning */
  145. }
  146. #if 0
  147. /* FIXME: This case currently triggers a false positives. */
  148. void
  149. registered_and_used_in_loop (void)
  150. {
  151. int i;
  152. double *p[123];
  153. static double q[234];
  154. for (i = 0; i < 123; i++)
  155. {
  156. p[i] = malloc (123 * sizeof *p[i]);
  157. #pragma starpu register p[i] 123
  158. }
  159. for (i = 0; i < 123; i++)
  160. my_task (p[i], q);
  161. }
  162. #endif