test-error-array-as-pointer.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <stddef.h>
  4. #include "libgccjit.h"
  5. #include "harness.h"
  6. #define BUFFER_SIZE (1024)
  7. char test_buffer[1024];
  8. void
  9. create_code (gcc_jit_context *ctxt, void *user_data)
  10. {
  11. /* Let's try to inject the equivalent of:
  12. void test_of_array_as_pointer (const char *name)
  13. {
  14. snprintf (test_buffer, sizeof (test_buffer),
  15. "hello %s", name);
  16. }
  17. */
  18. gcc_jit_type *void_type =
  19. gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_VOID);
  20. gcc_jit_type *const_char_ptr_type =
  21. gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_CONST_CHAR_PTR);
  22. gcc_jit_type *char_type =
  23. gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_CHAR);
  24. gcc_jit_type *char_ptr_type =
  25. gcc_jit_type_get_pointer (char_type);
  26. gcc_jit_type *int_type =
  27. gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT);
  28. gcc_jit_type *size_t_type =
  29. gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_SIZE_T);
  30. gcc_jit_type *buf_type =
  31. gcc_jit_context_new_array_type (ctxt, NULL, char_type, BUFFER_SIZE);
  32. /* extern int snprintf(char *str, size_t size, const char *format, ...); */
  33. gcc_jit_param *param_s =
  34. gcc_jit_context_new_param (ctxt, NULL, char_ptr_type, "s");
  35. gcc_jit_param *param_n =
  36. gcc_jit_context_new_param (ctxt, NULL, size_t_type, "n");
  37. gcc_jit_param *param_format =
  38. gcc_jit_context_new_param (ctxt, NULL, const_char_ptr_type, "format");
  39. gcc_jit_param *snprintf_params[3] = {param_s, param_n, param_format};
  40. gcc_jit_function *snprintf =
  41. gcc_jit_context_new_function (ctxt, NULL,
  42. GCC_JIT_FUNCTION_IMPORTED,
  43. int_type,
  44. "snprintf",
  45. 3, snprintf_params,
  46. 1);
  47. gcc_jit_param *param_name =
  48. gcc_jit_context_new_param (ctxt, NULL, const_char_ptr_type, "name");
  49. gcc_jit_function *test_fn =
  50. gcc_jit_context_new_function (ctxt, NULL,
  51. GCC_JIT_FUNCTION_EXPORTED,
  52. void_type,
  53. "test_of_array_as_pointer",
  54. 1, &param_name,
  55. 0);
  56. gcc_jit_lvalue *buffer =
  57. gcc_jit_context_new_global (ctxt, NULL,
  58. GCC_JIT_GLOBAL_IMPORTED,
  59. buf_type,
  60. "test_buffer");
  61. gcc_jit_block *block = gcc_jit_function_new_block(test_fn, "entry");
  62. /* snprintf(buffer, sizeof(buffer), "hello %s", name); */
  63. gcc_jit_rvalue *args[4];
  64. args[0] = gcc_jit_context_new_cast (
  65. ctxt, NULL,
  66. /* Here's the difference with test-array-as-pointer.c: */
  67. gcc_jit_lvalue_as_rvalue (buffer),
  68. char_ptr_type);
  69. args[1] = gcc_jit_context_new_rvalue_from_int (ctxt,
  70. size_t_type,
  71. BUFFER_SIZE);
  72. args[2] = gcc_jit_context_new_string_literal (ctxt, "hello %s");
  73. args[3] = gcc_jit_param_as_rvalue (param_name);
  74. gcc_jit_block_add_eval (
  75. block, NULL,
  76. gcc_jit_context_new_call (ctxt, NULL, snprintf, 4, args));
  77. gcc_jit_block_end_with_void_return (block, NULL);
  78. }
  79. void
  80. verify_code (gcc_jit_context *ctxt, gcc_jit_result *result)
  81. {
  82. CHECK_VALUE (result, NULL);
  83. /* Verify that the correct error message was emitted. */
  84. CHECK_STRING_VALUE (gcc_jit_context_get_first_error (ctxt),
  85. "gcc_jit_context_new_cast:"
  86. " cannot cast test_buffer"
  87. " from type: char[1024]"
  88. " to type: char *");
  89. }