1 diff -c -r Mesa-7.9/include/GL/gl.h MesaLib/include/GL/gl.h 2 *** Mesa-7.9/include/GL/gl.h Tue Apr 27 14:41:21 2010 3 --- MesaLib/include/GL/gl.h Thu Oct 14 14:41:53 2010 4 *************** 5 *** 55,61 **** 6 # if (defined(_MSC_VER) || defined(__MINGW32__)) && defined(BUILD_GL32) /* tag specify we're building mesa as a DLL */ 7 # define GLAPI __declspec(dllexport) 8 # elif (defined(_MSC_VER) || defined(__MINGW32__)) && defined(_DLL) /* tag specifying we're building for DLL runtime support */ 9 ! # define GLAPI __declspec(dllimport) 10 # else /* for use with static link lib build of Win32 edition only */ 11 # define GLAPI extern 12 # endif /* _STATIC_MESA support */ 13 --- 55,65 ---- 14 # if (defined(_MSC_VER) || defined(__MINGW32__)) && defined(BUILD_GL32) /* tag specify we're building mesa as a DLL */ 15 # define GLAPI __declspec(dllexport) 16 # elif (defined(_MSC_VER) || defined(__MINGW32__)) && defined(_DLL) /* tag specifying we're building for DLL runtime support */ 17 ! // We always retrieve the entry points dynamically via GetProcAddress or 18 ! // OSMesaGetProcAddress. This works around an issue where using the MSVC 19 ! // multi-threaded runtime library, which defines _DLL. 20 ! //# define GLAPI __declspec(dllimport) 21 ! # define GLAPI 22 # else /* for use with static link lib build of Win32 edition only */ 23 # define GLAPI extern 24 # endif /* _STATIC_MESA support */ 25 *************** 26 *** 72,80 **** 27 # define GLAPIENTRY 28 #endif /* WIN32 && !CYGWIN */ 29 30 ! #if (defined(__BEOS__) && defined(__POWERPC__)) || defined(__QUICKDRAW__) 31 ! # define PRAGMA_EXPORT_SUPPORTED 1 32 ! #endif 33 34 /* 35 * WINDOWS: Include windows.h here to define APIENTRY. 36 --- 76,86 ---- 37 # define GLAPIENTRY 38 #endif /* WIN32 && !CYGWIN */ 39 40 ! // Disabled this because __QUICKDRAW__ is defined on Mac and gcc does not 41 ! // support the pragma. 42 ! //#if (defined(__BEOS__) && defined(__POWERPC__)) || defined(__QUICKDRAW__) 43 ! //# define PRAGMA_EXPORT_SUPPORTED 1 44 ! //#endif 45 46 /* 47 * WINDOWS: Include windows.h here to define APIENTRY. 48 diff -c -r Mesa-7.9/include/GL/glext.h MesaLib/include/GL/glext.h 49 *** Mesa-7.9/include/GL/glext.h Fri Oct 1 15:51:28 2010 50 --- MesaLib/include/GL/glext.h Thu Oct 14 14:50:37 2010 51 *************** 52 *** 5030,5043 **** 53 54 #ifndef GL_VERSION_1_5 55 /* GL types for handling large vertex buffer objects */ 56 ! typedef ptrdiff_t GLintptr; 57 ! typedef ptrdiff_t GLsizeiptr; 58 #endif 59 60 #ifndef GL_ARB_vertex_buffer_object 61 /* GL types for handling large vertex buffer objects */ 62 ! typedef ptrdiff_t GLintptrARB; 63 ! typedef ptrdiff_t GLsizeiptrARB; 64 #endif 65 66 #ifndef GL_ARB_shader_objects 67 --- 5030,5043 ---- 68 69 #ifndef GL_VERSION_1_5 70 /* GL types for handling large vertex buffer objects */ 71 ! typedef signed long int GLintptr; 72 ! typedef signed long int GLsizeiptr; 73 #endif 74 75 #ifndef GL_ARB_vertex_buffer_object 76 /* GL types for handling large vertex buffer objects */ 77 ! typedef signed long int GLintptrARB; 78 ! typedef signed long int GLsizeiptrARB; 79 #endif 80 81 #ifndef GL_ARB_shader_objects 82 diff -c -r Mesa-7.9/include/GL/osmesa.h MesaLib/include/GL/osmesa.h 83 *** Mesa-7.9/include/GL/osmesa.h Thu Feb 4 16:10:39 2010 84 --- MesaLib/include/GL/osmesa.h Thu Oct 14 14:47:08 2010 85 *************** 86 *** 101,109 **** 87 typedef struct osmesa_context *OSMesaContext; 88 89 90 ! #if defined(__BEOS__) || defined(__QUICKDRAW__) 91 ! #pragma export on 92 ! #endif 93 94 95 /* 96 --- 101,111 ---- 97 typedef struct osmesa_context *OSMesaContext; 98 99 100 ! // Disabled this because __QUICKDRAW__ is defined on Mac and gcc does not 101 ! // support the pragma. 102 ! //#if defined(__BEOS__) || defined(__QUICKDRAW__) 103 ! //#pragma export on 104 ! //#endif 105 106 107 /* 108 *************** 109 *** 276,284 **** 110 OSMesaColorClamp(GLboolean enable); 111 112 113 ! #if defined(__BEOS__) || defined(__QUICKDRAW__) 114 ! #pragma export off 115 ! #endif 116 117 118 #ifdef __cplusplus 119 --- 278,288 ---- 120 OSMesaColorClamp(GLboolean enable); 121 122 123 ! // Disabled this because __QUICKDRAW__ is defined on Mac and gcc does not 124 ! // support the pragma. 125 ! //#if defined(__BEOS__) || defined(__QUICKDRAW__) 126 ! //#pragma export off 127 ! //#endif 128 129 130 #ifdef __cplusplus 131 diff -c -r Mesa-7.9/src/glsl/ast_to_hir.cpp MesaLib/src/glsl/ast_to_hir.cpp 132 *** Mesa-7.9/src/glsl/ast_to_hir.cpp Fri Oct 1 15:51:28 2010 133 --- MesaLib/src/glsl/ast_to_hir.cpp Fri Oct 22 15:28:47 2010 134 *************** 135 *** 55,60 **** 136 --- 55,61 ---- 137 #include "ast.h" 138 #include "glsl_types.h" 139 #include "ir.h" 140 + #include "safe_strcmp.h" 141 142 void 143 _mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state) 144 *************** 145 *** 1615,1621 **** 146 var->pixel_center_integer = qual->pixel_center_integer; 147 var->origin_upper_left = qual->origin_upper_left; 148 if ((qual->origin_upper_left || qual->pixel_center_integer) 149 ! && (strcmp(var->name, "gl_FragCoord") != 0)) { 150 const char *const qual_string = (qual->origin_upper_left) 151 ? "origin_upper_left" : "pixel_center_integer"; 152 153 --- 1616,1622 ---- 154 var->pixel_center_integer = qual->pixel_center_integer; 155 var->origin_upper_left = qual->origin_upper_left; 156 if ((qual->origin_upper_left || qual->pixel_center_integer) 157 ! && (safe_strcmp(var->name, "gl_FragCoord") != 0)) { 158 const char *const qual_string = (qual->origin_upper_left) 159 ? "origin_upper_left" : "pixel_center_integer"; 160 161 *************** 162 *** 2003,2009 **** 163 * gl_MaxTextureCoords." 164 */ 165 const unsigned size = unsigned(var->type->array_size()); 166 ! if ((strcmp("gl_TexCoord", var->name) == 0) 167 && (size > state->Const.MaxTextureCoords)) { 168 YYLTYPE loc = this->get_location(); 169 170 --- 2004,2010 ---- 171 * gl_MaxTextureCoords." 172 */ 173 const unsigned size = unsigned(var->type->array_size()); 174 ! if ((safe_strcmp("gl_TexCoord", var->name) == 0) 175 && (size > state->Const.MaxTextureCoords)) { 176 YYLTYPE loc = this->get_location(); 177 178 *************** 179 *** 2022,2028 **** 180 delete var; 181 var = NULL; 182 } else if (state->extensions->ARB_fragment_coord_conventions 183 ! && strcmp(var->name, "gl_FragCoord") == 0 184 && earlier->type == var->type 185 && earlier->mode == var->mode) { 186 /* Allow redeclaration of gl_FragCoord for ARB_fcc layout 187 --- 2023,2029 ---- 188 delete var; 189 var = NULL; 190 } else if (state->extensions->ARB_fragment_coord_conventions 191 ! && safe_strcmp(var->name, "gl_FragCoord") == 0 192 && earlier->type == var->type 193 && earlier->mode == var->mode) { 194 /* Allow redeclaration of gl_FragCoord for ARB_fcc layout 195 *************** 196 *** 2336,2342 **** 197 } 198 199 /* Verify the return type of main() */ 200 ! if (strcmp(name, "main") == 0) { 201 if (! return_type->is_void()) { 202 YYLTYPE loc = this->get_location(); 203 204 --- 2337,2343 ---- 205 } 206 207 /* Verify the return type of main() */ 208 ! if (safe_strcmp(name, "main") == 0) { 209 if (! return_type->is_void()) { 210 YYLTYPE loc = this->get_location(); 211 212 diff -c -r Mesa-7.9/src/glsl/glcpp/glcpp-parse.c MesaLib/src/glsl/glcpp/glcpp-parse.c 213 *** Mesa-7.9/src/glsl/glcpp/glcpp-parse.c Fri Oct 1 15:51:28 2010 214 --- MesaLib/src/glsl/glcpp/glcpp-parse.c Fri Oct 22 15:30:59 2010 215 *************** 216 *** 96,106 **** 217 --- 96,114 ---- 218 #include <stdlib.h> 219 #include <string.h> 220 #include <assert.h> 221 + /* The #include of inttypes.h causes problems on Windows */ 222 + #ifndef _MSC_VER 223 #include <inttypes.h> 224 + #endif 225 + /* Windows headers do not define PRIiMAX */ 226 + #ifdef _MSC_VER 227 + #define PRIiMAX "I64i" 228 + #endif 229 230 #include "glcpp.h" 231 #include "main/core.h" /* for struct gl_extensions */ 232 #include "main/mtypes.h" /* for gl_api enum */ 233 + #include "safe_strcmp.h" 234 235 #define glcpp_print(stream, str) stream = talloc_strdup_append(stream, str) 236 #define glcpp_printf(stream, fmt, args, ...) \ 237 *************** 238 *** 2915,2921 **** 239 return 0; 240 241 for (i = 0, node = list->head; node; i++, node = node->next) { 242 ! if (strcmp (node->str, member) == 0) { 243 if (index) 244 *index = i; 245 return 1; 246 --- 2923,2929 ---- 247 return 0; 248 249 for (i = 0, node = list->head; node; i++, node = node->next) { 250 ! if (safe_strcmp (node->str, member) == 0) { 251 if (index) 252 *index = i; 253 return 1; 254 *************** 255 *** 2955,2961 **** 256 node_a && node_b; 257 node_a = node_a->next, node_b = node_b->next) 258 { 259 ! if (strcmp (node_a->str, node_b->str)) 260 return 0; 261 } 262 263 --- 2963,2969 ---- 264 node_a && node_b; 265 node_a = node_a->next, node_b = node_b->next) 266 { 267 ! if (safe_strcmp (node_a->str, node_b->str)) 268 return 0; 269 } 270 271 *************** 272 *** 3182,3189 **** 273 case IDENTIFIER: 274 case INTEGER_STRING: 275 case OTHER: 276 ! if (strcmp (node_a->token->value.str, 277 ! node_b->token->value.str)) 278 { 279 return 0; 280 } 281 --- 3190,3197 ---- 282 case IDENTIFIER: 283 case INTEGER_STRING: 284 case OTHER: 285 ! if (safe_strcmp (node_a->token->value.str, 286 ! node_b->token->value.str)) 287 { 288 return 0; 289 } 290 *************** 291 *** 3832,3838 **** 292 return 0; 293 294 for (node = list; node; node = node->next) 295 ! if (strcmp (node->identifier, identifier) == 0) 296 return 1; 297 298 return 0; 299 --- 3840,3846 ---- 300 return 0; 301 302 for (node = list; node; node = node->next) 303 ! if (safe_strcmp (node->identifier, identifier) == 0) 304 return 1; 305 306 return 0; 307 diff -c -r Mesa-7.9/src/glsl/glcpp/glcpp-parse.y MesaLib/src/glsl/glcpp/glcpp-parse.y 308 *** Mesa-7.9/src/glsl/glcpp/glcpp-parse.y Fri Oct 1 15:51:28 2010 309 --- MesaLib/src/glsl/glcpp/glcpp-parse.y Fri Oct 22 15:30:47 2010 310 *************** 311 *** 26,36 **** 312 --- 26,44 ---- 313 #include <stdlib.h> 314 #include <string.h> 315 #include <assert.h> 316 + /* The #include of inttypes.h causes problems on Windows */ 317 + #ifndef _MSC_VER 318 #include <inttypes.h> 319 + #endif 320 + /* Windows headers do not define PRIiMAX */ 321 + #ifdef _MSC_VER 322 + #define PRIiMAX "I64i" 323 + #endif 324 325 #include "glcpp.h" 326 #include "main/core.h" /* for struct gl_extensions */ 327 #include "main/mtypes.h" /* for gl_api enum */ 328 + #include "safe_strcmp.h" 329 330 #define glcpp_print(stream, str) stream = talloc_strdup_append(stream, str) 331 #define glcpp_printf(stream, fmt, args, ...) \ 332 *************** 333 *** 590,596 **** 334 return 0; 335 336 for (i = 0, node = list->head; node; i++, node = node->next) { 337 ! if (strcmp (node->str, member) == 0) { 338 if (index) 339 *index = i; 340 return 1; 341 --- 598,604 ---- 342 return 0; 343 344 for (i = 0, node = list->head; node; i++, node = node->next) { 345 ! if (safe_strcmp (node->str, member) == 0) { 346 if (index) 347 *index = i; 348 return 1; 349 *************** 350 *** 630,636 **** 351 node_a && node_b; 352 node_a = node_a->next, node_b = node_b->next) 353 { 354 ! if (strcmp (node_a->str, node_b->str)) 355 return 0; 356 } 357 358 --- 638,644 ---- 359 node_a && node_b; 360 node_a = node_a->next, node_b = node_b->next) 361 { 362 ! if (safe_strcmp (node_a->str, node_b->str)) 363 return 0; 364 } 365 366 *************** 367 *** 857,864 **** 368 case IDENTIFIER: 369 case INTEGER_STRING: 370 case OTHER: 371 ! if (strcmp (node_a->token->value.str, 372 ! node_b->token->value.str)) 373 { 374 return 0; 375 } 376 --- 865,872 ---- 377 case IDENTIFIER: 378 case INTEGER_STRING: 379 case OTHER: 380 ! if (safe_strcmp (node_a->token->value.str, 381 ! node_b->token->value.str)) 382 { 383 return 0; 384 } 385 *************** 386 *** 1507,1513 **** 387 return 0; 388 389 for (node = list; node; node = node->next) 390 ! if (strcmp (node->identifier, identifier) == 0) 391 return 1; 392 393 return 0; 394 --- 1515,1521 ---- 395 return 0; 396 397 for (node = list; node; node = node->next) 398 ! if (safe_strcmp (node->identifier, identifier) == 0) 399 return 1; 400 401 return 0; 402 diff -c -r Mesa-7.9/src/glsl/glcpp/glcpp.c MesaLib/src/glsl/glcpp/glcpp.c 403 *** Mesa-7.9/src/glsl/glcpp/glcpp.c Fri Oct 1 15:51:28 2010 404 --- MesaLib/src/glsl/glcpp/glcpp.c Fri Oct 22 15:31:25 2010 405 *************** 406 *** 29,34 **** 407 --- 29,35 ---- 408 #include <errno.h> 409 #include "glcpp.h" 410 #include "main/mtypes.h" 411 + #include "safe_strcmp.h" 412 413 extern int yydebug; 414 415 *************** 416 *** 78,84 **** 417 char *text; 418 int fd; 419 420 ! if (filename == NULL || strcmp (filename, "-") == 0) 421 return load_text_fd (ctx, STDIN_FILENO); 422 423 fd = open (filename, O_RDONLY); 424 --- 79,85 ---- 425 char *text; 426 int fd; 427 428 ! if (filename == NULL || safe_strcmp (filename, "-") == 0) 429 return load_text_fd (ctx, STDIN_FILENO); 430 431 fd = open (filename, O_RDONLY); 432 diff -c -r Mesa-7.9/src/glsl/glcpp/glcpp.h MesaLib/src/glsl/glcpp/glcpp.h 433 *** Mesa-7.9/src/glsl/glcpp/glcpp.h Fri Oct 1 15:51:28 2010 434 --- MesaLib/src/glsl/glcpp/glcpp.h Fri Oct 22 15:32:43 2010 435 *************** 436 *** 24,30 **** 437 --- 24,33 ---- 438 #ifndef GLCPP_H 439 #define GLCPP_H 440 441 + /* Windows does not currently have stdint.h. */ 442 + #ifndef _MSC_VER 443 #include <stdint.h> 444 + #endif 445 446 #include <talloc.h> 447 448 *************** 449 *** 49,55 **** 450 --- 52,62 ---- 451 452 typedef union YYSTYPE 453 { 454 + #ifndef _MSC_VER 455 intmax_t ival; 456 + #else 457 + __int64 ival; 458 + #endif 459 char *str; 460 string_list_t *string_list; 461 token_t *token; 462 diff -c -r Mesa-7.9/src/glsl/glsl_parser.cpp MesaLib/src/glsl/glsl_parser.cpp 463 *** Mesa-7.9/src/glsl/glsl_parser.cpp Fri Oct 1 15:51:28 2010 464 --- MesaLib/src/glsl/glsl_parser.cpp Fri Oct 22 15:33:24 2010 465 *************** 466 *** 107,112 **** 467 --- 107,113 ---- 468 #include "ast.h" 469 #include "glsl_parser_extras.h" 470 #include "glsl_types.h" 471 + #include "safe_strcmp.h" 472 473 #define YYLEX_PARAM state->scanner 474 475 *************** 476 *** 3966,3975 **** 477 if (state->ARB_fragment_coord_conventions_enable) { 478 bool got_one = false; 479 480 ! if (strcmp((yyvsp[(1) - (1)].identifier), "origin_upper_left") == 0) { 481 got_one = true; 482 (yyval.type_qualifier).q.origin_upper_left = 1; 483 ! } else if (strcmp((yyvsp[(1) - (1)].identifier), "pixel_center_integer") == 0) { 484 got_one = true; 485 (yyval.type_qualifier).q.pixel_center_integer = 1; 486 } 487 --- 3967,3976 ---- 488 if (state->ARB_fragment_coord_conventions_enable) { 489 bool got_one = false; 490 491 ! if (safe_strcmp((yyvsp[(1) - (1)].identifier), "origin_upper_left") == 0) { 492 got_one = true; 493 (yyval.type_qualifier).q.origin_upper_left = 1; 494 ! } else if (safe_strcmp((yyvsp[(1) - (1)].identifier), "pixel_center_integer") == 0) { 495 got_one = true; 496 (yyval.type_qualifier).q.pixel_center_integer = 1; 497 } 498 diff -c -r Mesa-7.9/src/glsl/glsl_parser_extras.cpp MesaLib/src/glsl/glsl_parser_extras.cpp 499 *** Mesa-7.9/src/glsl/glsl_parser_extras.cpp Fri Oct 1 15:51:28 2010 500 --- MesaLib/src/glsl/glsl_parser_extras.cpp Fri Oct 22 15:33:37 2010 501 *************** 502 *** 35,40 **** 503 --- 35,41 ---- 504 #include "glsl_parser.h" 505 #include "ir_optimization.h" 506 #include "loop_analysis.h" 507 + #include "safe_strcmp.h" 508 509 _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct __GLcontextRec *ctx, 510 GLenum target, void *mem_ctx) 511 *************** 512 *** 148,160 **** 513 extension_warn 514 } ext_mode; 515 516 ! if (strcmp(behavior, "warn") == 0) { 517 ext_mode = extension_warn; 518 ! } else if (strcmp(behavior, "require") == 0) { 519 ext_mode = extension_require; 520 ! } else if (strcmp(behavior, "enable") == 0) { 521 ext_mode = extension_enable; 522 ! } else if (strcmp(behavior, "disable") == 0) { 523 ext_mode = extension_disable; 524 } else { 525 _mesa_glsl_error(behavior_locp, state, 526 --- 149,161 ---- 527 extension_warn 528 } ext_mode; 529 530 ! if (safe_strcmp(behavior, "warn") == 0) { 531 ext_mode = extension_warn; 532 ! } else if (safe_strcmp(behavior, "require") == 0) { 533 ext_mode = extension_require; 534 ! } else if (safe_strcmp(behavior, "enable") == 0) { 535 ext_mode = extension_enable; 536 ! } else if (safe_strcmp(behavior, "disable") == 0) { 537 ext_mode = extension_disable; 538 } else { 539 _mesa_glsl_error(behavior_locp, state, 540 *************** 541 *** 165,178 **** 542 543 bool unsupported = false; 544 545 ! if (strcmp(name, "all") == 0) { 546 if ((ext_mode == extension_enable) || (ext_mode == extension_require)) { 547 _mesa_glsl_error(name_locp, state, "Cannot %s all extensions", 548 (ext_mode == extension_enable) 549 ? "enable" : "require"); 550 return false; 551 } 552 ! } else if (strcmp(name, "GL_ARB_draw_buffers") == 0) { 553 /* This extension is only supported in fragment shaders. 554 */ 555 if (state->target != fragment_shader) { 556 --- 166,179 ---- 557 558 bool unsupported = false; 559 560 ! if (safe_strcmp(name, "all") == 0) { 561 if ((ext_mode == extension_enable) || (ext_mode == extension_require)) { 562 _mesa_glsl_error(name_locp, state, "Cannot %s all extensions", 563 (ext_mode == extension_enable) 564 ? "enable" : "require"); 565 return false; 566 } 567 ! } else if (safe_strcmp(name, "GL_ARB_draw_buffers") == 0) { 568 /* This extension is only supported in fragment shaders. 569 */ 570 if (state->target != fragment_shader) { 571 *************** 572 *** 181,197 **** 573 state->ARB_draw_buffers_enable = (ext_mode != extension_disable); 574 state->ARB_draw_buffers_warn = (ext_mode == extension_warn); 575 } 576 ! } else if (strcmp(name, "GL_ARB_fragment_coord_conventions") == 0) { 577 state->ARB_fragment_coord_conventions_enable = 578 (ext_mode != extension_disable); 579 state->ARB_fragment_coord_conventions_warn = 580 (ext_mode == extension_warn); 581 582 unsupported = !state->extensions->ARB_fragment_coord_conventions; 583 ! } else if (strcmp(name, "GL_ARB_texture_rectangle") == 0) { 584 state->ARB_texture_rectangle_enable = (ext_mode != extension_disable); 585 state->ARB_texture_rectangle_warn = (ext_mode == extension_warn); 586 ! } else if (strcmp(name, "GL_EXT_texture_array") == 0) { 587 state->EXT_texture_array_enable = (ext_mode != extension_disable); 588 state->EXT_texture_array_warn = (ext_mode == extension_warn); 589 590 --- 182,198 ---- 591 state->ARB_draw_buffers_enable = (ext_mode != extension_disable); 592 state->ARB_draw_buffers_warn = (ext_mode == extension_warn); 593 } 594 ! } else if (safe_strcmp(name, "GL_ARB_fragment_coord_conventions") == 0) { 595 state->ARB_fragment_coord_conventions_enable = 596 (ext_mode != extension_disable); 597 state->ARB_fragment_coord_conventions_warn = 598 (ext_mode == extension_warn); 599 600 unsupported = !state->extensions->ARB_fragment_coord_conventions; 601 ! } else if (safe_strcmp(name, "GL_ARB_texture_rectangle") == 0) { 602 state->ARB_texture_rectangle_enable = (ext_mode != extension_disable); 603 state->ARB_texture_rectangle_warn = (ext_mode == extension_warn); 604 ! } else if (safe_strcmp(name, "GL_EXT_texture_array") == 0) { 605 state->EXT_texture_array_enable = (ext_mode != extension_disable); 606 state->EXT_texture_array_warn = (ext_mode == extension_warn); 607 608 diff -c -r Mesa-7.9/src/glsl/glsl_types.cpp MesaLib/src/glsl/glsl_types.cpp 609 *** Mesa-7.9/src/glsl/glsl_types.cpp Fri Oct 1 15:51:28 2010 610 --- MesaLib/src/glsl/glsl_types.cpp Fri Oct 22 15:33:51 2010 611 *************** 612 *** 27,32 **** 613 --- 27,33 ---- 614 #include "glsl_symbol_table.h" 615 #include "glsl_parser_extras.h" 616 #include "glsl_types.h" 617 + #include "safe_strcmp.h" 618 #include "builtin_types.h" 619 extern "C" { 620 #include "program/hash_table.h" 621 *************** 622 *** 374,380 **** 623 /* Return zero is the types match (there is zero difference) or non-zero 624 * otherwise. 625 */ 626 ! if (strcmp(key1->name, key2->name) != 0) 627 return 1; 628 629 if (key1->length != key2->length) 630 --- 375,381 ---- 631 /* Return zero is the types match (there is zero difference) or non-zero 632 * otherwise. 633 */ 634 ! if (safe_strcmp(key1->name, key2->name) != 0) 635 return 1; 636 637 if (key1->length != key2->length) 638 *************** 639 *** 383,389 **** 640 for (unsigned i = 0; i < key1->length; i++) { 641 if (key1->fields.structure[i].type != key2->fields.structure[i].type) 642 return 1; 643 ! if (strcmp(key1->fields.structure[i].name, 644 key2->fields.structure[i].name) != 0) 645 return 1; 646 } 647 --- 384,390 ---- 648 for (unsigned i = 0; i < key1->length; i++) { 649 if (key1->fields.structure[i].type != key2->fields.structure[i].type) 650 return 1; 651 ! if (safe_strcmp(key1->fields.structure[i].name, 652 key2->fields.structure[i].name) != 0) 653 return 1; 654 } 655 *************** 656 *** 433,439 **** 657 658 assert(t->base_type == GLSL_TYPE_STRUCT); 659 assert(t->length == num_fields); 660 ! assert(strcmp(t->name, name) == 0); 661 662 return t; 663 } 664 --- 434,440 ---- 665 666 assert(t->base_type == GLSL_TYPE_STRUCT); 667 assert(t->length == num_fields); 668 ! assert(safe_strcmp(t->name, name) == 0); 669 670 return t; 671 } 672 *************** 673 *** 446,452 **** 674 return error_type; 675 676 for (unsigned i = 0; i < this->length; i++) { 677 ! if (strcmp(name, this->fields.structure[i].name) == 0) 678 return this->fields.structure[i].type; 679 } 680 681 --- 447,453 ---- 682 return error_type; 683 684 for (unsigned i = 0; i < this->length; i++) { 685 ! if (safe_strcmp(name, this->fields.structure[i].name) == 0) 686 return this->fields.structure[i].type; 687 } 688 689 *************** 690 *** 461,467 **** 691 return -1; 692 693 for (unsigned i = 0; i < this->length; i++) { 694 ! if (strcmp(name, this->fields.structure[i].name) == 0) 695 return i; 696 } 697 698 --- 462,468 ---- 699 return -1; 700 701 for (unsigned i = 0; i < this->length; i++) { 702 ! if (safe_strcmp(name, this->fields.structure[i].name) == 0) 703 return i; 704 } 705 706 diff -c -r Mesa-7.9/src/glsl/hir_field_selection.cpp MesaLib/src/glsl/hir_field_selection.cpp 707 *** Mesa-7.9/src/glsl/hir_field_selection.cpp Fri Oct 1 15:51:28 2010 708 --- MesaLib/src/glsl/hir_field_selection.cpp Fri Oct 22 15:34:11 2010 709 *************** 710 *** 26,31 **** 711 --- 26,32 ---- 712 #include "glsl_parser_extras.h" 713 #include "ast.h" 714 #include "glsl_types.h" 715 + #include "safe_strcmp.h" 716 717 ir_rvalue * 718 _mesa_ast_field_selection_to_hir(const ast_expression *expr, 719 *************** 720 *** 81,87 **** 721 const char *method; 722 method = call->subexpressions[0]->primary_expression.identifier; 723 724 ! if (op->type->is_array() && strcmp(method, "length") == 0) { 725 if (!call->expressions.is_empty()) 726 _mesa_glsl_error(&loc, state, "length method takes no arguments."); 727 728 --- 82,88 ---- 729 const char *method; 730 method = call->subexpressions[0]->primary_expression.identifier; 731 732 ! if (op->type->is_array() && safe_strcmp(method, "length") == 0) { 733 if (!call->expressions.is_empty()) 734 _mesa_glsl_error(&loc, state, "length method takes no arguments."); 735 736 diff -c -r Mesa-7.9/src/glsl/ir.cpp MesaLib/src/glsl/ir.cpp 737 *** Mesa-7.9/src/glsl/ir.cpp Fri Oct 1 15:51:28 2010 738 --- MesaLib/src/glsl/ir.cpp Fri Oct 22 15:34:20 2010 739 *************** 740 *** 25,30 **** 741 --- 25,31 ---- 742 #include "ir.h" 743 #include "ir_visitor.h" 744 #include "glsl_types.h" 745 + #include "safe_strcmp.h" 746 747 ir_rvalue::ir_rvalue() 748 { 749 *************** 750 *** 338,344 **** 751 { 752 const int operator_count = sizeof(operator_strs) / sizeof(operator_strs[0]); 753 for (int op = 0; op < operator_count; op++) { 754 ! if (strcmp(str, operator_strs[op]) == 0) 755 return (ir_expression_operation) op; 756 } 757 return (ir_expression_operation) -1; 758 --- 339,345 ---- 759 { 760 const int operator_count = sizeof(operator_strs) / sizeof(operator_strs[0]); 761 for (int op = 0; op < operator_count; op++) { 762 ! if (safe_strcmp(str, operator_strs[op]) == 0) 763 return (ir_expression_operation) op; 764 } 765 return (ir_expression_operation) -1; 766 *************** 767 *** 878,884 **** 768 { 769 const int count = sizeof(tex_opcode_strs) / sizeof(tex_opcode_strs[0]); 770 for (int op = 0; op < count; op++) { 771 ! if (strcmp(str, tex_opcode_strs[op]) == 0) 772 return (ir_texture_opcode) op; 773 } 774 return (ir_texture_opcode) -1; 775 --- 879,885 ---- 776 { 777 const int count = sizeof(tex_opcode_strs) / sizeof(tex_opcode_strs[0]); 778 for (int op = 0; op < count; op++) { 779 ! if (safe_strcmp(str, tex_opcode_strs[op]) == 0) 780 return (ir_texture_opcode) op; 781 } 782 return (ir_texture_opcode) -1; 783 diff -c -r Mesa-7.9/src/glsl/ir_constant_expression.cpp MesaLib/src/glsl/ir_constant_expression.cpp 784 *** Mesa-7.9/src/glsl/ir_constant_expression.cpp Fri Oct 1 15:51:28 2010 785 --- MesaLib/src/glsl/ir_constant_expression.cpp Fri Oct 22 15:34:40 2010 786 *************** 787 *** 38,43 **** 788 --- 38,44 ---- 789 #include "ir.h" 790 #include "ir_visitor.h" 791 #include "glsl_types.h" 792 + #include "safe_strcmp.h" 793 794 static float 795 dot(ir_constant *op0, ir_constant *op1) 796 *************** 797 *** 850,880 **** 798 memset(&data, 0, sizeof(data)); 799 800 const char *callee = this->callee_name(); 801 ! if (strcmp(callee, "abs") == 0) { 802 expr = new(mem_ctx) ir_expression(ir_unop_abs, type, op[0], NULL); 803 ! } else if (strcmp(callee, "all") == 0) { 804 assert(op[0]->type->is_boolean()); 805 for (unsigned c = 0; c < op[0]->type->components(); c++) { 806 if (!op[0]->value.b[c]) 807 return new(mem_ctx) ir_constant(false); 808 } 809 return new(mem_ctx) ir_constant(true); 810 ! } else if (strcmp(callee, "any") == 0) { 811 assert(op[0]->type->is_boolean()); 812 for (unsigned c = 0; c < op[0]->type->components(); c++) { 813 if (op[0]->value.b[c]) 814 return new(mem_ctx) ir_constant(true); 815 } 816 return new(mem_ctx) ir_constant(false); 817 ! } else if (strcmp(callee, "acos") == 0) { 818 assert(op[0]->type->is_float()); 819 for (unsigned c = 0; c < op[0]->type->components(); c++) 820 data.f[c] = acosf(op[0]->value.f[c]); 821 ! } else if (strcmp(callee, "asin") == 0) { 822 assert(op[0]->type->is_float()); 823 for (unsigned c = 0; c < op[0]->type->components(); c++) 824 data.f[c] = asinf(op[0]->value.f[c]); 825 ! } else if (strcmp(callee, "atan") == 0) { 826 assert(op[0]->type->is_float()); 827 if (num_parameters == 2) { 828 assert(op[1]->type->is_float()); 829 --- 851,881 ---- 830 memset(&data, 0, sizeof(data)); 831 832 const char *callee = this->callee_name(); 833 ! if (safe_strcmp(callee, "abs") == 0) { 834 expr = new(mem_ctx) ir_expression(ir_unop_abs, type, op[0], NULL); 835 ! } else if (safe_strcmp(callee, "all") == 0) { 836 assert(op[0]->type->is_boolean()); 837 for (unsigned c = 0; c < op[0]->type->components(); c++) { 838 if (!op[0]->value.b[c]) 839 return new(mem_ctx) ir_constant(false); 840 } 841 return new(mem_ctx) ir_constant(true); 842 ! } else if (safe_strcmp(callee, "any") == 0) { 843 assert(op[0]->type->is_boolean()); 844 for (unsigned c = 0; c < op[0]->type->components(); c++) { 845 if (op[0]->value.b[c]) 846 return new(mem_ctx) ir_constant(true); 847 } 848 return new(mem_ctx) ir_constant(false); 849 ! } else if (safe_strcmp(callee, "acos") == 0) { 850 assert(op[0]->type->is_float()); 851 for (unsigned c = 0; c < op[0]->type->components(); c++) 852 data.f[c] = acosf(op[0]->value.f[c]); 853 ! } else if (safe_strcmp(callee, "asin") == 0) { 854 assert(op[0]->type->is_float()); 855 for (unsigned c = 0; c < op[0]->type->components(); c++) 856 data.f[c] = asinf(op[0]->value.f[c]); 857 ! } else if (safe_strcmp(callee, "atan") == 0) { 858 assert(op[0]->type->is_float()); 859 if (num_parameters == 2) { 860 assert(op[1]->type->is_float()); 861 *************** 862 *** 884,894 **** 863 for (unsigned c = 0; c < op[0]->type->components(); c++) 864 data.f[c] = atanf(op[0]->value.f[c]); 865 } 866 ! } else if (strcmp(callee, "dFdx") == 0 || strcmp(callee, "dFdy") == 0) { 867 return ir_constant::zero(mem_ctx, this->type); 868 ! } else if (strcmp(callee, "ceil") == 0) { 869 expr = new(mem_ctx) ir_expression(ir_unop_ceil, type, op[0], NULL); 870 ! } else if (strcmp(callee, "clamp") == 0) { 871 assert(num_parameters == 3); 872 unsigned c1_inc = op[1]->type->is_scalar() ? 0 : 1; 873 unsigned c2_inc = op[2]->type->is_scalar() ? 0 : 1; 874 --- 885,895 ---- 875 for (unsigned c = 0; c < op[0]->type->components(); c++) 876 data.f[c] = atanf(op[0]->value.f[c]); 877 } 878 ! } else if (safe_strcmp(callee, "dFdx") == 0 || safe_strcmp(callee, "dFdy") == 0) { 879 return ir_constant::zero(mem_ctx, this->type); 880 ! } else if (safe_strcmp(callee, "ceil") == 0) { 881 expr = new(mem_ctx) ir_expression(ir_unop_ceil, type, op[0], NULL); 882 ! } else if (safe_strcmp(callee, "clamp") == 0) { 883 assert(num_parameters == 3); 884 unsigned c1_inc = op[1]->type->is_scalar() ? 0 : 1; 885 unsigned c2_inc = op[2]->type->is_scalar() ? 0 : 1; 886 *************** 887 *** 913,931 **** 888 assert(!"Should not get here."); 889 } 890 } 891 ! } else if (strcmp(callee, "cos") == 0) { 892 expr = new(mem_ctx) ir_expression(ir_unop_cos, type, op[0], NULL); 893 ! } else if (strcmp(callee, "cosh") == 0) { 894 assert(op[0]->type->is_float()); 895 for (unsigned c = 0; c < op[0]->type->components(); c++) 896 data.f[c] = coshf(op[0]->value.f[c]); 897 ! } else if (strcmp(callee, "cross") == 0) { 898 expr = new(mem_ctx) ir_expression(ir_binop_cross, type, op[0], op[1]); 899 ! } else if (strcmp(callee, "degrees") == 0) { 900 assert(op[0]->type->is_float()); 901 for (unsigned c = 0; c < op[0]->type->components(); c++) 902 data.f[c] = 180.0/M_PI * op[0]->value.f[c]; 903 ! } else if (strcmp(callee, "distance") == 0) { 904 assert(op[0]->type->is_float() && op[1]->type->is_float()); 905 float length_squared = 0.0; 906 for (unsigned c = 0; c < op[0]->type->components(); c++) { 907 --- 914,932 ---- 908 assert(!"Should not get here."); 909 } 910 } 911 ! } else if (safe_strcmp(callee, "cos") == 0) { 912 expr = new(mem_ctx) ir_expression(ir_unop_cos, type, op[0], NULL); 913 ! } else if (safe_strcmp(callee, "cosh") == 0) { 914 assert(op[0]->type->is_float()); 915 for (unsigned c = 0; c < op[0]->type->components(); c++) 916 data.f[c] = coshf(op[0]->value.f[c]); 917 ! } else if (safe_strcmp(callee, "cross") == 0) { 918 expr = new(mem_ctx) ir_expression(ir_binop_cross, type, op[0], op[1]); 919 ! } else if (safe_strcmp(callee, "degrees") == 0) { 920 assert(op[0]->type->is_float()); 921 for (unsigned c = 0; c < op[0]->type->components(); c++) 922 data.f[c] = 180.0/M_PI * op[0]->value.f[c]; 923 ! } else if (safe_strcmp(callee, "distance") == 0) { 924 assert(op[0]->type->is_float() && op[1]->type->is_float()); 925 float length_squared = 0.0; 926 for (unsigned c = 0; c < op[0]->type->components(); c++) { 927 *************** 928 *** 933,941 **** 929 length_squared += t * t; 930 } 931 return new(mem_ctx) ir_constant(sqrtf(length_squared)); 932 ! } else if (strcmp(callee, "dot") == 0) { 933 return new(mem_ctx) ir_constant(dot(op[0], op[1])); 934 ! } else if (strcmp(callee, "equal") == 0) { 935 assert(op[0]->type->is_vector() && op[1] && op[1]->type->is_vector()); 936 for (unsigned c = 0; c < op[0]->type->components(); c++) { 937 switch (op[0]->type->base_type) { 938 --- 934,942 ---- 939 length_squared += t * t; 940 } 941 return new(mem_ctx) ir_constant(sqrtf(length_squared)); 942 ! } else if (safe_strcmp(callee, "dot") == 0) { 943 return new(mem_ctx) ir_constant(dot(op[0], op[1])); 944 ! } else if (safe_strcmp(callee, "equal") == 0) { 945 assert(op[0]->type->is_vector() && op[1] && op[1]->type->is_vector()); 946 for (unsigned c = 0; c < op[0]->type->components(); c++) { 947 switch (op[0]->type->base_type) { 948 *************** 949 *** 955,976 **** 950 assert(!"Should not get here."); 951 } 952 } 953 ! } else if (strcmp(callee, "exp") == 0) { 954 expr = new(mem_ctx) ir_expression(ir_unop_exp, type, op[0], NULL); 955 ! } else if (strcmp(callee, "exp2") == 0) { 956 expr = new(mem_ctx) ir_expression(ir_unop_exp2, type, op[0], NULL); 957 ! } else if (strcmp(callee, "faceforward") == 0) { 958 if (dot(op[2], op[1]) < 0) 959 return op[0]; 960 for (unsigned c = 0; c < op[0]->type->components(); c++) 961 data.f[c] = -op[0]->value.f[c]; 962 ! } else if (strcmp(callee, "floor") == 0) { 963 expr = new(mem_ctx) ir_expression(ir_unop_floor, type, op[0], NULL); 964 ! } else if (strcmp(callee, "fract") == 0) { 965 expr = new(mem_ctx) ir_expression(ir_unop_fract, type, op[0], NULL); 966 ! } else if (strcmp(callee, "fwidth") == 0) { 967 return ir_constant::zero(mem_ctx, this->type); 968 ! } else if (strcmp(callee, "greaterThan") == 0) { 969 assert(op[0]->type->is_vector() && op[1] && op[1]->type->is_vector()); 970 for (unsigned c = 0; c < op[0]->type->components(); c++) { 971 switch (op[0]->type->base_type) { 972 --- 956,977 ---- 973 assert(!"Should not get here."); 974 } 975 } 976 ! } else if (safe_strcmp(callee, "exp") == 0) { 977 expr = new(mem_ctx) ir_expression(ir_unop_exp, type, op[0], NULL); 978 ! } else if (safe_strcmp(callee, "exp2") == 0) { 979 expr = new(mem_ctx) ir_expression(ir_unop_exp2, type, op[0], NULL); 980 ! } else if (safe_strcmp(callee, "faceforward") == 0) { 981 if (dot(op[2], op[1]) < 0) 982 return op[0]; 983 for (unsigned c = 0; c < op[0]->type->components(); c++) 984 data.f[c] = -op[0]->value.f[c]; 985 ! } else if (safe_strcmp(callee, "floor") == 0) { 986 expr = new(mem_ctx) ir_expression(ir_unop_floor, type, op[0], NULL); 987 ! } else if (safe_strcmp(callee, "fract") == 0) { 988 expr = new(mem_ctx) ir_expression(ir_unop_fract, type, op[0], NULL); 989 ! } else if (safe_strcmp(callee, "fwidth") == 0) { 990 return ir_constant::zero(mem_ctx, this->type); 991 ! } else if (safe_strcmp(callee, "greaterThan") == 0) { 992 assert(op[0]->type->is_vector() && op[1] && op[1]->type->is_vector()); 993 for (unsigned c = 0; c < op[0]->type->components(); c++) { 994 switch (op[0]->type->base_type) { 995 *************** 996 *** 987,993 **** 997 assert(!"Should not get here."); 998 } 999 } 1000 ! } else if (strcmp(callee, "greaterThanEqual") == 0) { 1001 assert(op[0]->type->is_vector() && op[1] && op[1]->type->is_vector()); 1002 for (unsigned c = 0; c < op[0]->type->components(); c++) { 1003 switch (op[0]->type->base_type) { 1004 --- 988,994 ---- 1005 assert(!"Should not get here."); 1006 } 1007 } 1008 ! } else if (safe_strcmp(callee, "greaterThanEqual") == 0) { 1009 assert(op[0]->type->is_vector() && op[1] && op[1]->type->is_vector()); 1010 for (unsigned c = 0; c < op[0]->type->components(); c++) { 1011 switch (op[0]->type->base_type) { 1012 *************** 1013 *** 1004,1014 **** 1014 assert(!"Should not get here."); 1015 } 1016 } 1017 ! } else if (strcmp(callee, "inversesqrt") == 0) { 1018 expr = new(mem_ctx) ir_expression(ir_unop_rsq, type, op[0], NULL); 1019 ! } else if (strcmp(callee, "length") == 0) { 1020 return new(mem_ctx) ir_constant(sqrtf(dot(op[0], op[0]))); 1021 ! } else if (strcmp(callee, "lessThan") == 0) { 1022 assert(op[0]->type->is_vector() && op[1] && op[1]->type->is_vector()); 1023 for (unsigned c = 0; c < op[0]->type->components(); c++) { 1024 switch (op[0]->type->base_type) { 1025 --- 1005,1015 ---- 1026 assert(!"Should not get here."); 1027 } 1028 } 1029 ! } else if (safe_strcmp(callee, "inversesqrt") == 0) { 1030 expr = new(mem_ctx) ir_expression(ir_unop_rsq, type, op[0], NULL); 1031 ! } else if (safe_strcmp(callee, "length") == 0) { 1032 return new(mem_ctx) ir_constant(sqrtf(dot(op[0], op[0]))); 1033 ! } else if (safe_strcmp(callee, "lessThan") == 0) { 1034 assert(op[0]->type->is_vector() && op[1] && op[1]->type->is_vector()); 1035 for (unsigned c = 0; c < op[0]->type->components(); c++) { 1036 switch (op[0]->type->base_type) { 1037 *************** 1038 *** 1025,1031 **** 1039 assert(!"Should not get here."); 1040 } 1041 } 1042 ! } else if (strcmp(callee, "lessThanEqual") == 0) { 1043 assert(op[0]->type->is_vector() && op[1] && op[1]->type->is_vector()); 1044 for (unsigned c = 0; c < op[0]->type->components(); c++) { 1045 switch (op[0]->type->base_type) { 1046 --- 1026,1032 ---- 1047 assert(!"Should not get here."); 1048 } 1049 } 1050 ! } else if (safe_strcmp(callee, "lessThanEqual") == 0) { 1051 assert(op[0]->type->is_vector() && op[1] && op[1]->type->is_vector()); 1052 for (unsigned c = 0; c < op[0]->type->components(); c++) { 1053 switch (op[0]->type->base_type) { 1054 *************** 1055 *** 1042,1060 **** 1056 assert(!"Should not get here."); 1057 } 1058 } 1059 ! } else if (strcmp(callee, "log") == 0) { 1060 expr = new(mem_ctx) ir_expression(ir_unop_log, type, op[0], NULL); 1061 ! } else if (strcmp(callee, "log2") == 0) { 1062 expr = new(mem_ctx) ir_expression(ir_unop_log2, type, op[0], NULL); 1063 ! } else if (strcmp(callee, "matrixCompMult") == 0) { 1064 assert(op[0]->type->is_float() && op[1]->type->is_float()); 1065 for (unsigned c = 0; c < op[0]->type->components(); c++) 1066 data.f[c] = op[0]->value.f[c] * op[1]->value.f[c]; 1067 ! } else if (strcmp(callee, "max") == 0) { 1068 expr = new(mem_ctx) ir_expression(ir_binop_max, type, op[0], op[1]); 1069 ! } else if (strcmp(callee, "min") == 0) { 1070 expr = new(mem_ctx) ir_expression(ir_binop_min, type, op[0], op[1]); 1071 ! } else if (strcmp(callee, "mix") == 0) { 1072 assert(op[0]->type->is_float() && op[1]->type->is_float()); 1073 if (op[2]->type->is_float()) { 1074 unsigned c2_inc = op[2]->type->is_scalar() ? 0 : 1; 1075 --- 1043,1061 ---- 1076 assert(!"Should not get here."); 1077 } 1078 } 1079 ! } else if (safe_strcmp(callee, "log") == 0) { 1080 expr = new(mem_ctx) ir_expression(ir_unop_log, type, op[0], NULL); 1081 ! } else if (safe_strcmp(callee, "log2") == 0) { 1082 expr = new(mem_ctx) ir_expression(ir_unop_log2, type, op[0], NULL); 1083 ! } else if (safe_strcmp(callee, "matrixCompMult") == 0) { 1084 assert(op[0]->type->is_float() && op[1]->type->is_float()); 1085 for (unsigned c = 0; c < op[0]->type->components(); c++) 1086 data.f[c] = op[0]->value.f[c] * op[1]->value.f[c]; 1087 ! } else if (safe_strcmp(callee, "max") == 0) { 1088 expr = new(mem_ctx) ir_expression(ir_binop_max, type, op[0], op[1]); 1089 ! } else if (safe_strcmp(callee, "min") == 0) { 1090 expr = new(mem_ctx) ir_expression(ir_binop_min, type, op[0], op[1]); 1091 ! } else if (safe_strcmp(callee, "mix") == 0) { 1092 assert(op[0]->type->is_float() && op[1]->type->is_float()); 1093 if (op[2]->type->is_float()) { 1094 unsigned c2_inc = op[2]->type->is_scalar() ? 0 : 1; 1095 *************** 1096 *** 1068,1076 **** 1097 for (unsigned c = 0; c < op[0]->type->components(); c++) 1098 data.f[c] = op[op[2]->value.b[c] ? 1 : 0]->value.f[c]; 1099 } 1100 ! } else if (strcmp(callee, "mod") == 0) { 1101 expr = new(mem_ctx) ir_expression(ir_binop_mod, type, op[0], op[1]); 1102 ! } else if (strcmp(callee, "normalize") == 0) { 1103 assert(op[0]->type->is_float()); 1104 float length = sqrtf(dot(op[0], op[0])); 1105 1106 --- 1069,1077 ---- 1107 for (unsigned c = 0; c < op[0]->type->components(); c++) 1108 data.f[c] = op[op[2]->value.b[c] ? 1 : 0]->value.f[c]; 1109 } 1110 ! } else if (safe_strcmp(callee, "mod") == 0) { 1111 expr = new(mem_ctx) ir_expression(ir_binop_mod, type, op[0], op[1]); 1112 ! } else if (safe_strcmp(callee, "normalize") == 0) { 1113 assert(op[0]->type->is_float()); 1114 float length = sqrtf(dot(op[0], op[0])); 1115 1116 *************** 1117 *** 1079,1087 **** 1118 1119 for (unsigned c = 0; c < op[0]->type->components(); c++) 1120 data.f[c] = op[0]->value.f[c] / length; 1121 ! } else if (strcmp(callee, "not") == 0) { 1122 expr = new(mem_ctx) ir_expression(ir_unop_logic_not, type, op[0], NULL); 1123 ! } else if (strcmp(callee, "notEqual") == 0) { 1124 assert(op[0]->type->is_vector() && op[1] && op[1]->type->is_vector()); 1125 for (unsigned c = 0; c < op[0]->type->components(); c++) { 1126 switch (op[0]->type->base_type) { 1127 --- 1080,1088 ---- 1128 1129 for (unsigned c = 0; c < op[0]->type->components(); c++) 1130 data.f[c] = op[0]->value.f[c] / length; 1131 ! } else if (safe_strcmp(callee, "not") == 0) { 1132 expr = new(mem_ctx) ir_expression(ir_unop_logic_not, type, op[0], NULL); 1133 ! } else if (safe_strcmp(callee, "notEqual") == 0) { 1134 assert(op[0]->type->is_vector() && op[1] && op[1]->type->is_vector()); 1135 for (unsigned c = 0; c < op[0]->type->components(); c++) { 1136 switch (op[0]->type->base_type) { 1137 *************** 1138 *** 1101,1107 **** 1139 assert(!"Should not get here."); 1140 } 1141 } 1142 ! } else if (strcmp(callee, "outerProduct") == 0) { 1143 assert(op[0]->type->is_vector() && op[1]->type->is_vector()); 1144 const unsigned m = op[0]->type->vector_elements; 1145 const unsigned n = op[1]->type->vector_elements; 1146 --- 1102,1108 ---- 1147 assert(!"Should not get here."); 1148 } 1149 } 1150 ! } else if (safe_strcmp(callee, "outerProduct") == 0) { 1151 assert(op[0]->type->is_vector() && op[1]->type->is_vector()); 1152 const unsigned m = op[0]->type->vector_elements; 1153 const unsigned n = op[1]->type->vector_elements; 1154 *************** 1155 *** 1110,1127 **** 1156 data.f[i+m*j] = op[0]->value.f[i] * op[1]->value.f[j]; 1157 } 1158 } 1159 ! } else if (strcmp(callee, "pow") == 0) { 1160 expr = new(mem_ctx) ir_expression(ir_binop_pow, type, op[0], op[1]); 1161 ! } else if (strcmp(callee, "radians") == 0) { 1162 assert(op[0]->type->is_float()); 1163 for (unsigned c = 0; c < op[0]->type->components(); c++) 1164 data.f[c] = M_PI/180.0 * op[0]->value.f[c]; 1165 ! } else if (strcmp(callee, "reflect") == 0) { 1166 assert(op[0]->type->is_float()); 1167 float dot_NI = dot(op[1], op[0]); 1168 for (unsigned c = 0; c < op[0]->type->components(); c++) 1169 data.f[c] = op[0]->value.f[c] - 2 * dot_NI * op[1]->value.f[c]; 1170 ! } else if (strcmp(callee, "refract") == 0) { 1171 const float eta = op[2]->value.f[0]; 1172 const float dot_NI = dot(op[1], op[0]); 1173 const float k = 1.0 - eta * eta * (1.0 - dot_NI * dot_NI); 1174 --- 1111,1128 ---- 1175 data.f[i+m*j] = op[0]->value.f[i] * op[1]->value.f[j]; 1176 } 1177 } 1178 ! } else if (safe_strcmp(callee, "pow") == 0) { 1179 expr = new(mem_ctx) ir_expression(ir_binop_pow, type, op[0], op[1]); 1180 ! } else if (safe_strcmp(callee, "radians") == 0) { 1181 assert(op[0]->type->is_float()); 1182 for (unsigned c = 0; c < op[0]->type->components(); c++) 1183 data.f[c] = M_PI/180.0 * op[0]->value.f[c]; 1184 ! } else if (safe_strcmp(callee, "reflect") == 0) { 1185 assert(op[0]->type->is_float()); 1186 float dot_NI = dot(op[1], op[0]); 1187 for (unsigned c = 0; c < op[0]->type->components(); c++) 1188 data.f[c] = op[0]->value.f[c] - 2 * dot_NI * op[1]->value.f[c]; 1189 ! } else if (safe_strcmp(callee, "refract") == 0) { 1190 const float eta = op[2]->value.f[0]; 1191 const float dot_NI = dot(op[1], op[0]); 1192 const float k = 1.0 - eta * eta * (1.0 - dot_NI * dot_NI); 1193 *************** 1194 *** 1133,1147 **** 1195 * op[1]->value.f[c]; 1196 } 1197 } 1198 ! } else if (strcmp(callee, "sign") == 0) { 1199 expr = new(mem_ctx) ir_expression(ir_unop_sign, type, op[0], NULL); 1200 ! } else if (strcmp(callee, "sin") == 0) { 1201 expr = new(mem_ctx) ir_expression(ir_unop_sin, type, op[0], NULL); 1202 ! } else if (strcmp(callee, "sinh") == 0) { 1203 assert(op[0]->type->is_float()); 1204 for (unsigned c = 0; c < op[0]->type->components(); c++) 1205 data.f[c] = sinhf(op[0]->value.f[c]); 1206 ! } else if (strcmp(callee, "smoothstep") == 0) { 1207 assert(num_parameters == 3); 1208 assert(op[1]->type == op[0]->type); 1209 unsigned edge_inc = op[0]->type->is_scalar() ? 0 : 1; 1210 --- 1134,1148 ---- 1211 * op[1]->value.f[c]; 1212 } 1213 } 1214 ! } else if (safe_strcmp(callee, "sign") == 0) { 1215 expr = new(mem_ctx) ir_expression(ir_unop_sign, type, op[0], NULL); 1216 ! } else if (safe_strcmp(callee, "sin") == 0) { 1217 expr = new(mem_ctx) ir_expression(ir_unop_sin, type, op[0], NULL); 1218 ! } else if (safe_strcmp(callee, "sinh") == 0) { 1219 assert(op[0]->type->is_float()); 1220 for (unsigned c = 0; c < op[0]->type->components(); c++) 1221 data.f[c] = sinhf(op[0]->value.f[c]); 1222 ! } else if (safe_strcmp(callee, "smoothstep") == 0) { 1223 assert(num_parameters == 3); 1224 assert(op[1]->type == op[0]->type); 1225 unsigned edge_inc = op[0]->type->is_scalar() ? 0 : 1; 1226 *************** 1227 *** 1157,1179 **** 1228 data.f[c] = t * t * (3 - 2 * t); 1229 } 1230 } 1231 ! } else if (strcmp(callee, "sqrt") == 0) { 1232 expr = new(mem_ctx) ir_expression(ir_unop_sqrt, type, op[0], NULL); 1233 ! } else if (strcmp(callee, "step") == 0) { 1234 assert(op[0]->type->is_float() && op[1]->type->is_float()); 1235 /* op[0] (edge) may be either a scalar or a vector */ 1236 const unsigned c0_inc = op[0]->type->is_scalar() ? 0 : 1; 1237 for (unsigned c = 0, c0 = 0; c < type->components(); c0 += c0_inc, c++) 1238 data.f[c] = (op[1]->value.f[c] < op[0]->value.f[c0]) ? 0.0 : 1.0; 1239 ! } else if (strcmp(callee, "tan") == 0) { 1240 assert(op[0]->type->is_float()); 1241 for (unsigned c = 0; c < op[0]->type->components(); c++) 1242 data.f[c] = tanf(op[0]->value.f[c]); 1243 ! } else if (strcmp(callee, "tanh") == 0) { 1244 assert(op[0]->type->is_float()); 1245 for (unsigned c = 0; c < op[0]->type->components(); c++) 1246 data.f[c] = tanhf(op[0]->value.f[c]); 1247 ! } else if (strcmp(callee, "transpose") == 0) { 1248 assert(op[0]->type->is_matrix()); 1249 const unsigned n = op[0]->type->vector_elements; 1250 const unsigned m = op[0]->type->matrix_columns; 1251 --- 1158,1180 ---- 1252 data.f[c] = t * t * (3 - 2 * t); 1253 } 1254 } 1255 ! } else if (safe_strcmp(callee, "sqrt") == 0) { 1256 expr = new(mem_ctx) ir_expression(ir_unop_sqrt, type, op[0], NULL); 1257 ! } else if (safe_strcmp(callee, "step") == 0) { 1258 assert(op[0]->type->is_float() && op[1]->type->is_float()); 1259 /* op[0] (edge) may be either a scalar or a vector */ 1260 const unsigned c0_inc = op[0]->type->is_scalar() ? 0 : 1; 1261 for (unsigned c = 0, c0 = 0; c < type->components(); c0 += c0_inc, c++) 1262 data.f[c] = (op[1]->value.f[c] < op[0]->value.f[c0]) ? 0.0 : 1.0; 1263 ! } else if (safe_strcmp(callee, "tan") == 0) { 1264 assert(op[0]->type->is_float()); 1265 for (unsigned c = 0; c < op[0]->type->components(); c++) 1266 data.f[c] = tanf(op[0]->value.f[c]); 1267 ! } else if (safe_strcmp(callee, "tanh") == 0) { 1268 assert(op[0]->type->is_float()); 1269 for (unsigned c = 0; c < op[0]->type->components(); c++) 1270 data.f[c] = tanhf(op[0]->value.f[c]); 1271 ! } else if (safe_strcmp(callee, "transpose") == 0) { 1272 assert(op[0]->type->is_matrix()); 1273 const unsigned n = op[0]->type->vector_elements; 1274 const unsigned m = op[0]->type->matrix_columns; 1275 diff -c -r Mesa-7.9/src/glsl/ir_dead_functions.cpp MesaLib/src/glsl/ir_dead_functions.cpp 1276 *** Mesa-7.9/src/glsl/ir_dead_functions.cpp Fri Oct 1 15:51:28 2010 1277 --- MesaLib/src/glsl/ir_dead_functions.cpp Fri Oct 22 15:34:54 2010 1278 *************** 1279 *** 31,36 **** 1280 --- 31,37 ---- 1281 #include "ir_visitor.h" 1282 #include "ir_expression_flattening.h" 1283 #include "glsl_types.h" 1284 + #include "safe_strcmp.h" 1285 1286 class signature_entry : public exec_node 1287 { 1288 *************** 1289 *** 90,96 **** 1290 { 1291 signature_entry *entry = this->get_signature_entry(ir); 1292 1293 ! if (strcmp(ir->function_name(), "main") == 0) { 1294 entry->used = true; 1295 } 1296 1297 --- 91,97 ---- 1298 { 1299 signature_entry *entry = this->get_signature_entry(ir); 1300 1301 ! if (safe_strcmp(ir->function_name(), "main") == 0) { 1302 entry->used = true; 1303 } 1304 1305 diff -c -r Mesa-7.9/src/glsl/ir_function_inlining.cpp MesaLib/src/glsl/ir_function_inlining.cpp 1306 *** Mesa-7.9/src/glsl/ir_function_inlining.cpp Fri Oct 1 15:51:28 2010 1307 --- MesaLib/src/glsl/ir_function_inlining.cpp Fri Oct 22 15:35:58 2010 1308 *************** 1309 *** 27,33 **** 1310 * Replaces calls to functions with the body of the function. 1311 */ 1312 1313 ! #include <inttypes.h> 1314 #include "ir.h" 1315 #include "ir_visitor.h" 1316 #include "ir_function_inlining.h" 1317 --- 27,34 ---- 1318 * Replaces calls to functions with the body of the function. 1319 */ 1320 1321 ! /* The use of inttypes.h seems to be unnecessary and causes problems on Windows. */ 1322 ! /* #include <inttypes.h> */ 1323 #include "ir.h" 1324 #include "ir_visitor.h" 1325 #include "ir_function_inlining.h" 1326 diff -c -r Mesa-7.9/src/glsl/ir_lower_jumps.cpp MesaLib/src/glsl/ir_lower_jumps.cpp 1327 *** Mesa-7.9/src/glsl/ir_lower_jumps.cpp Fri Oct 1 15:51:28 2010 1328 --- MesaLib/src/glsl/ir_lower_jumps.cpp Fri Oct 22 15:36:16 2010 1329 *************** 1330 *** 28,33 **** 1331 --- 28,34 ---- 1332 #include "glsl_types.h" 1333 #include <string.h> 1334 #include "ir.h" 1335 + #include "safe_strcmp.h" 1336 1337 enum jump_strength 1338 { 1339 *************** 1340 *** 125,131 **** 1341 this->return_flag = 0; 1342 this->return_value = 0; 1343 this->nesting_depth = 0; 1344 ! this->is_main = this->signature && (strcmp(this->signature->function_name(), "main") == 0); 1345 } 1346 1347 ir_variable* get_return_flag() 1348 --- 126,132 ---- 1349 this->return_flag = 0; 1350 this->return_value = 0; 1351 this->nesting_depth = 0; 1352 ! this->is_main = this->signature && (safe_strcmp(this->signature->function_name(), "main") == 0); 1353 } 1354 1355 ir_variable* get_return_flag() 1356 diff -c -r Mesa-7.9/src/glsl/ir_reader.cpp MesaLib/src/glsl/ir_reader.cpp 1357 *** Mesa-7.9/src/glsl/ir_reader.cpp Fri Oct 1 15:51:28 2010 1358 --- MesaLib/src/glsl/ir_reader.cpp Fri Oct 22 15:36:27 2010 1359 *************** 1360 *** 31,36 **** 1361 --- 31,37 ---- 1362 #include "glsl_parser_extras.h" 1363 #include "glsl_types.h" 1364 #include "s_expression.h" 1365 + #include "safe_strcmp.h" 1366 1367 const static bool debug = false; 1368 1369 *************** 1370 *** 128,134 **** 1371 ir_read_error(st, expr, "expected type (array ...) or (struct ...)"); 1372 return NULL; 1373 } 1374 ! if (strcmp(type_sym->value(), "array") == 0) { 1375 if (list->length() != 3) { 1376 ir_read_error(st, expr, "expected type (array <type> <int>)"); 1377 return NULL; 1378 --- 129,135 ---- 1379 ir_read_error(st, expr, "expected type (array ...) or (struct ...)"); 1380 return NULL; 1381 } 1382 ! if (safe_strcmp(type_sym->value(), "array") == 0) { 1383 if (list->length() != 3) { 1384 ir_read_error(st, expr, "expected type (array <type> <int>)"); 1385 return NULL; 1386 *************** 1387 *** 150,156 **** 1388 } 1389 1390 return glsl_type::get_array_instance(base_type, size->value()); 1391 ! } else if (strcmp(type_sym->value(), "struct") == 0) { 1392 assert(false); // FINISHME 1393 } else { 1394 ir_read_error(st, expr, "expected (array ...) or (struct ...); " 1395 --- 151,157 ---- 1396 } 1397 1398 return glsl_type::get_array_instance(base_type, size->value()); 1399 ! } else if (safe_strcmp(type_sym->value(), "struct") == 0) { 1400 assert(false); // FINISHME 1401 } else { 1402 ir_read_error(st, expr, "expected (array ...) or (struct ...); " 1403 *************** 1404 *** 189,195 **** 1405 continue; // not a (function ...); ignore it. 1406 1407 s_symbol *tag = SX_AS_SYMBOL(sub->subexpressions.get_head()); 1408 ! if (tag == NULL || strcmp(tag->value(), "function") != 0) 1409 continue; // not a (function ...); ignore it. 1410 1411 ir_function *f = read_function(st, sub, true); 1412 --- 190,196 ---- 1413 continue; // not a (function ...); ignore it. 1414 1415 s_symbol *tag = SX_AS_SYMBOL(sub->subexpressions.get_head()); 1416 ! if (tag == NULL || safe_strcmp(tag->value(), "function") != 0) 1417 continue; // not a (function ...); ignore it. 1418 1419 ir_function *f = read_function(st, sub, true); 1420 *************** 1421 *** 233,239 **** 1422 } 1423 1424 s_symbol *tag = SX_AS_SYMBOL(siglist->subexpressions.get_head()); 1425 ! if (tag == NULL || strcmp(tag->value(), "signature") != 0) { 1426 ir_read_error(st, siglist, "Expected (signature ...)"); 1427 return NULL; 1428 } 1429 --- 234,240 ---- 1430 } 1431 1432 s_symbol *tag = SX_AS_SYMBOL(siglist->subexpressions.get_head()); 1433 ! if (tag == NULL || safe_strcmp(tag->value(), "signature") != 0) { 1434 ir_read_error(st, siglist, "Expected (signature ...)"); 1435 return NULL; 1436 } 1437 *************** 1438 *** 267,273 **** 1439 return; 1440 } 1441 s_symbol *paramtag = SX_AS_SYMBOL(paramlist->subexpressions.get_head()); 1442 ! if (paramtag == NULL || strcmp(paramtag->value(), "parameters") != 0) { 1443 ir_read_error(st, paramlist, "Expected (parameters ...)"); 1444 return; 1445 } 1446 --- 268,274 ---- 1447 return; 1448 } 1449 s_symbol *paramtag = SX_AS_SYMBOL(paramlist->subexpressions.get_head()); 1450 ! if (paramtag == NULL || safe_strcmp(paramtag->value(), "parameters") != 0) { 1451 ir_read_error(st, paramlist, "Expected (parameters ...)"); 1452 return; 1453 } 1454 *************** 1455 *** 364,372 **** 1456 void *ctx = st; 1457 s_symbol *symbol = SX_AS_SYMBOL(expr); 1458 if (symbol != NULL) { 1459 ! if (strcmp(symbol->value(), "break") == 0 && loop_ctx != NULL) 1460 return new(ctx) ir_loop_jump(ir_loop_jump::jump_break); 1461 ! if (strcmp(symbol->value(), "continue") == 0 && loop_ctx != NULL) 1462 return new(ctx) ir_loop_jump(ir_loop_jump::jump_continue); 1463 } 1464 1465 --- 365,373 ---- 1466 void *ctx = st; 1467 s_symbol *symbol = SX_AS_SYMBOL(expr); 1468 if (symbol != NULL) { 1469 ! if (safe_strcmp(symbol->value(), "break") == 0 && loop_ctx != NULL) 1470 return new(ctx) ir_loop_jump(ir_loop_jump::jump_break); 1471 ! if (safe_strcmp(symbol->value(), "continue") == 0 && loop_ctx != NULL) 1472 return new(ctx) ir_loop_jump(ir_loop_jump::jump_continue); 1473 } 1474 1475 *************** 1476 *** 383,399 **** 1477 } 1478 1479 ir_instruction *inst = NULL; 1480 ! if (strcmp(tag->value(), "declare") == 0) { 1481 inst = read_declaration(st, list); 1482 ! } else if (strcmp(tag->value(), "assign") == 0) { 1483 inst = read_assignment(st, list); 1484 ! } else if (strcmp(tag->value(), "if") == 0) { 1485 inst = read_if(st, list, loop_ctx); 1486 ! } else if (strcmp(tag->value(), "loop") == 0) { 1487 inst = read_loop(st, list); 1488 ! } else if (strcmp(tag->value(), "return") == 0) { 1489 inst = read_return(st, list); 1490 ! } else if (strcmp(tag->value(), "function") == 0) { 1491 inst = read_function(st, list, false); 1492 } else { 1493 inst = read_rvalue(st, list); 1494 --- 384,400 ---- 1495 } 1496 1497 ir_instruction *inst = NULL; 1498 ! if (safe_strcmp(tag->value(), "declare") == 0) { 1499 inst = read_declaration(st, list); 1500 ! } else if (safe_strcmp(tag->value(), "assign") == 0) { 1501 inst = read_assignment(st, list); 1502 ! } else if (safe_strcmp(tag->value(), "if") == 0) { 1503 inst = read_if(st, list, loop_ctx); 1504 ! } else if (safe_strcmp(tag->value(), "loop") == 0) { 1505 inst = read_loop(st, list); 1506 ! } else if (safe_strcmp(tag->value(), "return") == 0) { 1507 inst = read_return(st, list); 1508 ! } else if (safe_strcmp(tag->value(), "function") == 0) { 1509 inst = read_function(st, list, false); 1510 } else { 1511 inst = read_rvalue(st, list); 1512 *************** 1513 *** 443,467 **** 1514 } 1515 1516 // FINISHME: Check for duplicate/conflicting qualifiers. 1517 ! if (strcmp(qualifier->value(), "centroid") == 0) { 1518 var->centroid = 1; 1519 ! } else if (strcmp(qualifier->value(), "invariant") == 0) { 1520 var->invariant = 1; 1521 ! } else if (strcmp(qualifier->value(), "uniform") == 0) { 1522 var->mode = ir_var_uniform; 1523 ! } else if (strcmp(qualifier->value(), "auto") == 0) { 1524 var->mode = ir_var_auto; 1525 ! } else if (strcmp(qualifier->value(), "in") == 0) { 1526 var->mode = ir_var_in; 1527 ! } else if (strcmp(qualifier->value(), "out") == 0) { 1528 var->mode = ir_var_out; 1529 ! } else if (strcmp(qualifier->value(), "inout") == 0) { 1530 var->mode = ir_var_inout; 1531 ! } else if (strcmp(qualifier->value(), "smooth") == 0) { 1532 var->interpolation = ir_var_smooth; 1533 ! } else if (strcmp(qualifier->value(), "flat") == 0) { 1534 var->interpolation = ir_var_flat; 1535 ! } else if (strcmp(qualifier->value(), "noperspective") == 0) { 1536 var->interpolation = ir_var_noperspective; 1537 } else { 1538 ir_read_error(st, list, "unknown qualifier: %s", qualifier->value()); 1539 --- 444,468 ---- 1540 } 1541 1542 // FINISHME: Check for duplicate/conflicting qualifiers. 1543 ! if (safe_strcmp(qualifier->value(), "centroid") == 0) { 1544 var->centroid = 1; 1545 ! } else if (safe_strcmp(qualifier->value(), "invariant") == 0) { 1546 var->invariant = 1; 1547 ! } else if (safe_strcmp(qualifier->value(), "uniform") == 0) { 1548 var->mode = ir_var_uniform; 1549 ! } else if (safe_strcmp(qualifier->value(), "auto") == 0) { 1550 var->mode = ir_var_auto; 1551 ! } else if (safe_strcmp(qualifier->value(), "in") == 0) { 1552 var->mode = ir_var_in; 1553 ! } else if (safe_strcmp(qualifier->value(), "out") == 0) { 1554 var->mode = ir_var_out; 1555 ! } else if (safe_strcmp(qualifier->value(), "inout") == 0) { 1556 var->mode = ir_var_inout; 1557 ! } else if (safe_strcmp(qualifier->value(), "smooth") == 0) { 1558 var->interpolation = ir_var_smooth; 1559 ! } else if (safe_strcmp(qualifier->value(), "flat") == 0) { 1560 var->interpolation = ir_var_flat; 1561 ! } else if (safe_strcmp(qualifier->value(), "noperspective") == 0) { 1562 var->interpolation = ir_var_noperspective; 1563 } else { 1564 ir_read_error(st, list, "unknown qualifier: %s", qualifier->value()); 1565 *************** 1566 *** 574,586 **** 1567 ir_rvalue *rvalue = read_dereference(st, list); 1568 if (rvalue != NULL || st->error) 1569 return rvalue; 1570 ! else if (strcmp(tag->value(), "swiz") == 0) { 1571 rvalue = read_swizzle(st, list); 1572 ! } else if (strcmp(tag->value(), "expression") == 0) { 1573 rvalue = read_expression(st, list); 1574 ! } else if (strcmp(tag->value(), "call") == 0) { 1575 rvalue = read_call(st, list); 1576 ! } else if (strcmp(tag->value(), "constant") == 0) { 1577 rvalue = read_constant(st, list); 1578 } else { 1579 rvalue = read_texture(st, list); 1580 --- 575,587 ---- 1581 ir_rvalue *rvalue = read_dereference(st, list); 1582 if (rvalue != NULL || st->error) 1583 return rvalue; 1584 ! else if (safe_strcmp(tag->value(), "swiz") == 0) { 1585 rvalue = read_swizzle(st, list); 1586 ! } else if (safe_strcmp(tag->value(), "expression") == 0) { 1587 rvalue = read_expression(st, list); 1588 ! } else if (safe_strcmp(tag->value(), "call") == 0) { 1589 rvalue = read_call(st, list); 1590 ! } else if (safe_strcmp(tag->value(), "constant") == 0) { 1591 rvalue = read_constant(st, list); 1592 } else { 1593 rvalue = read_texture(st, list); 1594 *************** 1595 *** 921,931 **** 1596 s_symbol *tag = SX_AS_SYMBOL(list->subexpressions.head); 1597 assert(tag != NULL); 1598 1599 ! if (strcmp(tag->value(), "var_ref") == 0) 1600 return read_var_ref(st, list); 1601 ! if (strcmp(tag->value(), "array_ref") == 0) 1602 return read_array_ref(st, list); 1603 ! if (strcmp(tag->value(), "record_ref") == 0) 1604 return read_record_ref(st, list); 1605 return NULL; 1606 } 1607 --- 922,932 ---- 1608 s_symbol *tag = SX_AS_SYMBOL(list->subexpressions.head); 1609 assert(tag != NULL); 1610 1611 ! if (safe_strcmp(tag->value(), "var_ref") == 0) 1612 return read_var_ref(st, list); 1613 ! if (safe_strcmp(tag->value(), "array_ref") == 0) 1614 return read_array_ref(st, list); 1615 ! if (safe_strcmp(tag->value(), "record_ref") == 0) 1616 return read_record_ref(st, list); 1617 return NULL; 1618 } 1619 diff -c -r Mesa-7.9/src/glsl/ir_structure_splitting.cpp MesaLib/src/glsl/ir_structure_splitting.cpp 1620 *** Mesa-7.9/src/glsl/ir_structure_splitting.cpp Fri Oct 1 15:51:28 2010 1621 --- MesaLib/src/glsl/ir_structure_splitting.cpp Fri Oct 22 15:36:52 2010 1622 *************** 1623 *** 37,42 **** 1624 --- 37,43 ---- 1625 #include "ir_print_visitor.h" 1626 #include "ir_rvalue_visitor.h" 1627 #include "glsl_types.h" 1628 + #include "safe_strcmp.h" 1629 1630 static bool debug = false; 1631 1632 *************** 1633 *** 228,235 **** 1634 1635 unsigned int i; 1636 for (i = 0; i < entry->var->type->length; i++) { 1637 ! if (strcmp(deref_record->field, 1638 ! entry->var->type->fields.structure[i].name) == 0) 1639 break; 1640 } 1641 assert(i != entry->var->type->length); 1642 --- 229,236 ---- 1643 1644 unsigned int i; 1645 for (i = 0; i < entry->var->type->length; i++) { 1646 ! if (safe_strcmp(deref_record->field, 1647 ! entry->var->type->fields.structure[i].name) == 0) 1648 break; 1649 } 1650 assert(i != entry->var->type->length); 1651 diff -c -r Mesa-7.9/src/glsl/ir_validate.cpp MesaLib/src/glsl/ir_validate.cpp 1652 *** Mesa-7.9/src/glsl/ir_validate.cpp Mon Oct 4 18:58:00 2010 1653 --- MesaLib/src/glsl/ir_validate.cpp Fri Oct 22 15:37:24 2010 1654 *************** 1655 *** 33,39 **** 1656 * a dereference chain. 1657 */ 1658 1659 ! #include <inttypes.h> 1660 #include "ir.h" 1661 #include "ir_hierarchical_visitor.h" 1662 #include "program/hash_table.h" 1663 --- 33,40 ---- 1664 * a dereference chain. 1665 */ 1666 1667 ! /* The use of inttypes.h seems to be unnecessary and causes problems on Windows. */ 1668 ! /* #include <inttypes.h> */ 1669 #include "ir.h" 1670 #include "ir_hierarchical_visitor.h" 1671 #include "program/hash_table.h" 1672 diff -c -r Mesa-7.9/src/glsl/linker.cpp MesaLib/src/glsl/linker.cpp 1673 *** Mesa-7.9/src/glsl/linker.cpp Fri Oct 1 15:51:28 2010 1674 --- MesaLib/src/glsl/linker.cpp Fri Oct 22 15:38:08 2010 1675 *************** 1676 *** 79,84 **** 1677 --- 79,85 ---- 1678 #include "program/hash_table.h" 1679 #include "linker.h" 1680 #include "ir_optimization.h" 1681 + #include "safe_strcmp.h" 1682 1683 /** 1684 * Visitor that determines whether or not a variable is ever written. 1685 *************** 1686 *** 95,101 **** 1687 { 1688 ir_variable *const var = ir->lhs->variable_referenced(); 1689 1690 ! if (strcmp(name, var->name) == 0) { 1691 found = true; 1692 return visit_stop; 1693 } 1694 --- 96,102 ---- 1695 { 1696 ir_variable *const var = ir->lhs->variable_referenced(); 1697 1698 ! if (safe_strcmp(name, var->name) == 0) { 1699 found = true; 1700 return visit_stop; 1701 } 1702 *************** 1703 *** 113,119 **** 1704 if (sig_param->mode == ir_var_out || 1705 sig_param->mode == ir_var_inout) { 1706 ir_variable *var = param_rval->variable_referenced(); 1707 ! if (var && strcmp(name, var->name) == 0) { 1708 found = true; 1709 return visit_stop; 1710 } 1711 --- 114,120 ---- 1712 if (sig_param->mode == ir_var_out || 1713 sig_param->mode == ir_var_inout) { 1714 ir_variable *var = param_rval->variable_referenced(); 1715 ! if (var && safe_strcmp(name, var->name) == 0) { 1716 found = true; 1717 return visit_stop; 1718 } 1719 *************** 1720 *** 148,154 **** 1721 1722 virtual ir_visitor_status visit(ir_dereference_variable *ir) 1723 { 1724 ! if (strcmp(this->name, ir->var->name) == 0) { 1725 this->found = true; 1726 return visit_stop; 1727 } 1728 --- 149,155 ---- 1729 1730 virtual ir_visitor_status visit(ir_dereference_variable *ir) 1731 { 1732 ! if (safe_strcmp(this->name, ir->var->name) == 0) { 1733 this->found = true; 1734 return visit_stop; 1735 } 1736 *************** 1737 *** 876,882 **** 1738 if (!other_var) 1739 continue; 1740 1741 ! if (strcmp(var->name, other_var->name) == 0 && 1742 other_var->max_array_access > size) { 1743 size = other_var->max_array_access; 1744 } 1745 --- 877,883 ---- 1746 if (!other_var) 1747 continue; 1748 1749 ! if (safe_strcmp(var->name, other_var->name) == 0 && 1750 other_var->max_array_access > size) { 1751 size = other_var->max_array_access; 1752 } 1753 diff -c -r Mesa-7.9/src/mapi/glapi/glapi_nop.c MesaLib/src/mapi/glapi/glapi_nop.c 1754 *** Mesa-7.9/src/mapi/glapi/glapi_nop.c Fri Oct 1 15:51:28 2010 1755 --- MesaLib/src/mapi/glapi/glapi_nop.c Fri Oct 22 15:41:35 2010 1756 *************** 1757 *** 107,113 **** 1758 return 0; 1759 } 1760 1761 ! #define TABLE_ENTRY(name) (_glapi_proc) NoOpGeneric 1762 1763 #endif 1764 1765 --- 107,138 ---- 1766 return 0; 1767 } 1768 1769 ! /** 1770 ! * This is called if the user somehow calls an unassigned GL dispatch function. 1771 ! */ 1772 ! static GLint 1773 ! NoOpUnused(void) 1774 ! { 1775 ! return NoOpGeneric(); 1776 ! } 1777 ! 1778 ! /* 1779 ! * It is necessary to generate custom no-op entry points at least on 1780 ! * Windows, where the __stdcall calling convention is used (callee 1781 ! * cleans the stack). This calling convention can not tolerate a 1782 ! * mismatch between the numbers of arguments in caller and callee. 1783 ! */ 1784 ! #define KEYWORD1 static 1785 ! #define KEYWORD1_ALT static 1786 ! #define KEYWORD2 GLAPIENTRY 1787 ! #define NAME(func) NoOp##func 1788 ! #define DISPATCH(func, args, msg) NoOpGeneric(); 1789 ! #define RETURN_DISPATCH(func, args, msg) return NoOpGeneric(); 1790 ! 1791 ! /* 1792 ! * Defines for the table of no-op entry points. 1793 ! */ 1794 ! #define TABLE_ENTRY(name) (_glapi_proc) NoOp##name 1795 1796 #endif 1797 1798 diff -c -r Mesa-7.9/src/mesa/main/compiler.h MesaLib/src/mesa/main/compiler.h 1799 *** Mesa-7.9/src/mesa/main/compiler.h Fri Oct 1 15:51:28 2010 1800 --- MesaLib/src/mesa/main/compiler.h Fri Oct 22 15:44:23 2010 1801 *************** 1802 *** 175,181 **** 1803 --- 175,183 ---- 1804 # define PUBLIC __attribute__((visibility("default"))) 1805 # define USED __attribute__((used)) 1806 #else 1807 + # ifndef PUBLIC 1808 # define PUBLIC 1809 + # endif 1810 # define USED 1811 #endif 1812 1813 diff -c -r Mesa-7.9/src/mesa/main/histogram.c MesaLib/src/mesa/main/histogram.c 1814 *** Mesa-7.9/src/mesa/main/histogram.c Mon Oct 4 18:58:00 2010 1815 --- MesaLib/src/mesa/main/histogram.c Tue Oct 26 11:17:37 2010 1816 *************** 1817 *** 32,37 **** 1818 --- 32,40 ---- 1819 #include "macros.h" 1820 #include "main/dispatch.h" 1821 1822 + #if defined(_MSC_VER) 1823 + #pragma optimize("", off) 1824 + #endif 1825 1826 #if FEATURE_histogram 1827 1828 diff -c -r Mesa-7.9/src/mesa/main/image.c MesaLib/src/mesa/main/image.c 1829 *** Mesa-7.9/src/mesa/main/image.c Mon Oct 4 18:58:00 2010 1830 --- MesaLib/src/mesa/main/image.c Tue Oct 26 11:17:45 2010 1831 *************** 1832 *** 37,42 **** 1833 --- 37,45 ---- 1834 #include "imports.h" 1835 #include "macros.h" 1836 1837 + #if defined(_MSC_VER) 1838 + #pragma optimize("", off) 1839 + #endif 1840 1841 /** 1842 * NOTE: 1843 diff -c -r Mesa-7.9/src/mesa/main/mipmap.c MesaLib/src/mesa/main/mipmap.c 1844 *** Mesa-7.9/src/mesa/main/mipmap.c Fri Oct 1 15:51:28 2010 1845 --- MesaLib/src/mesa/main/mipmap.c Tue Oct 26 11:17:52 2010 1846 *************** 1847 *** 34,40 **** 1848 #include "texstore.h" 1849 #include "image.h" 1850 1851 ! 1852 1853 static GLint 1854 bytes_per_pixel(GLenum datatype, GLuint comps) 1855 --- 34,42 ---- 1856 #include "texstore.h" 1857 #include "image.h" 1858 1859 ! #if defined(_MSC_VER) 1860 ! #pragma optimize("", off) 1861 ! #endif 1862 1863 static GLint 1864 bytes_per_pixel(GLenum datatype, GLuint comps) 1865 diff -c -r Mesa-7.9/src/mesa/main/querymatrix.c MesaLib/src/mesa/main/querymatrix.c 1866 *** Mesa-7.9/src/mesa/main/querymatrix.c Mon Oct 4 18:58:00 2010 1867 --- MesaLib/src/mesa/main/querymatrix.c Wed Oct 6 16:36:08 2010 1868 *************** 1869 *** 73,79 **** 1870 #elif defined(__APPLE__) || defined(__CYGWIN__) || defined(__FreeBSD__) || \ 1871 defined(__OpenBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || \ 1872 (defined(__sun) && defined(__C99FEATURES__)) || defined(__MINGW32__) || \ 1873 ! (defined(__sun) && defined(__GNUC__)) 1874 1875 /* fpclassify is available. */ 1876 1877 --- 73,80 ---- 1878 #elif defined(__APPLE__) || defined(__CYGWIN__) || defined(__FreeBSD__) || \ 1879 defined(__OpenBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || \ 1880 (defined(__sun) && defined(__C99FEATURES__)) || defined(__MINGW32__) || \ 1881 ! (defined(__sun) && defined(__GNUC__)) || \ 1882 ! (defined(__linux) && defined(__GNUC__)) 1883 1884 /* fpclassify is available. */ 1885 1886 diff -c -r Mesa-7.9/src/mesa/math/m_eval.c MesaLib/src/mesa/math/m_eval.c 1887 *** Mesa-7.9/src/mesa/math/m_eval.c Thu Feb 4 16:10:40 2010 1888 --- MesaLib/src/mesa/math/m_eval.c Tue Oct 26 11:18:00 2010 1889 *************** 1890 *** 41,46 **** 1891 --- 41,50 ---- 1892 #include "main/config.h" 1893 #include "m_eval.h" 1894 1895 + #if defined(_MSC_VER) 1896 + #pragma optimize("", off) 1897 + #endif 1898 + 1899 static GLfloat inv_tab[MAX_EVAL_ORDER]; 1900 1901 1902 diff -c -r Mesa-7.9/src/mesa/swrast/s_texcombine.c MesaLib/src/mesa/swrast/s_texcombine.c 1903 *** Mesa-7.9/src/mesa/swrast/s_texcombine.c Fri Oct 1 15:51:28 2010 1904 --- MesaLib/src/mesa/swrast/s_texcombine.c Tue Oct 26 11:01:39 2010 1905 *************** 1906 *** 34,39 **** 1907 --- 34,42 ---- 1908 #include "s_context.h" 1909 #include "s_texcombine.h" 1910 1911 + #if defined(_MSC_VER) 1912 + #pragma optimize("", off) 1913 + #endif 1914 1915 /** 1916 * Pointer to array of float[4] 1917 diff -c -r Mesa-7.9/src/mapi/glapi/gen/gl_apitemp.py MesaLib/src/mapi/glapi/gen/gl_apitemp.py 1918 *** Mesa-7.9/src/mapi/glapi/gen/gl_apitemp.py Mon Aug 15 09:14:29 2011 1919 --- MesaLib/src/mapi/glapi/gen/gl_apitemp.py Thu Aug 11 21:23:47 2011 1920 *************** 1921 *** 79,89 **** 1922 comma = ", " 1923 1924 1925 - if f.return_type != 'void': 1926 - dispatch = "RETURN_DISPATCH" 1927 - else: 1928 - dispatch = "DISPATCH" 1929 - 1930 need_proto = False 1931 if not f.is_static_entry_point(name): 1932 need_proto = True 1933 --- 79,84 ---- 1934 *************** 1935 *** 97,108 **** 1936 1937 print '%s %s KEYWORD2 NAME(%s)(%s)' % (keyword, f.return_type, n, f.get_parameter_string(name)) 1938 print '{' 1939 ! if p_string == "": 1940 ! print ' %s(%s, (), (F, "gl%s();\\n"));' \ 1941 ! % (dispatch, f.name, name) 1942 else: 1943 ! print ' %s(%s, (%s), (F, "gl%s(%s);\\n", %s));' \ 1944 ! % (dispatch, f.name, p_string, name, t_string, o_string) 1945 print '}' 1946 print '' 1947 return 1948 --- 92,113 ---- 1949 1950 print '%s %s KEYWORD2 NAME(%s)(%s)' % (keyword, f.return_type, n, f.get_parameter_string(name)) 1951 print '{' 1952 ! if f.return_type != 'void': 1953 ! dispatch = "RETURN_DISPATCH" 1954 ! if p_string == "": 1955 ! print ' %s(%s, %s, (), (F, "gl%s();\\n"));' \ 1956 ! % (dispatch, f.return_type, f.name, name) 1957 ! else: 1958 ! print ' %s(%s, %s, (%s), (F, "gl%s(%s);\\n", %s));' \ 1959 ! % (dispatch, f.return_type, f.name, p_string, name, t_string, o_string) 1960 else: 1961 ! dispatch = "DISPATCH" 1962 ! if p_string == "": 1963 ! print ' %s(%s, (), (F, "gl%s();\\n"));' \ 1964 ! % (dispatch, f.name, name) 1965 ! else: 1966 ! print ' %s(%s, (%s), (F, "gl%s(%s);\\n", %s));' \ 1967 ! % (dispatch, f.name, p_string, name, t_string, o_string) 1968 print '}' 1969 print '' 1970 return 1971 *************** 1972 *** 120,126 **** 1973 * NAME(n) - builds the final function name (usually add "gl" prefix) 1974 * DISPATCH(func, args, msg) - code to do dispatch of named function. 1975 * msg is a printf-style debug message. 1976 ! * RETURN_DISPATCH(func, args, msg) - code to do dispatch with a return value 1977 * 1978 * Here is an example which generates the usual OpenGL functions: 1979 * #define KEYWORD1 1980 --- 125,132 ---- 1981 * NAME(n) - builds the final function name (usually add "gl" prefix) 1982 * DISPATCH(func, args, msg) - code to do dispatch of named function. 1983 * msg is a printf-style debug message. 1984 ! * RETURN_DISPATCH(type, func, args, msg) - code to do dispatch with a 1985 ! * return value of type. 1986 * 1987 * Here is an example which generates the usual OpenGL functions: 1988 * #define KEYWORD1 1989 diff -c -r Mesa-7.9/src/mapi/glapi/glapi_dispatch.c MesaLib/src/mapi/glapi/glapi_dispatch.c 1990 *** Mesa-7.9/src/mapi/glapi/glapi_dispatch.c Mon Aug 15 09:14:30 2011 1991 --- MesaLib/src/mapi/glapi/glapi_dispatch.c Thu Aug 11 21:25:55 2011 1992 *************** 1993 *** 65,71 **** 1994 fprintf MESSAGE; \ 1995 CALL_ ## FUNC(GET_DISPATCH(), ARGS); 1996 1997 ! #define RETURN_DISPATCH(FUNC, ARGS, MESSAGE) \ 1998 fprintf MESSAGE; \ 1999 return CALL_ ## FUNC(GET_DISPATCH(), ARGS); 2000 2001 --- 65,71 ---- 2002 fprintf MESSAGE; \ 2003 CALL_ ## FUNC(GET_DISPATCH(), ARGS); 2004 2005 ! #define RETURN_DISPATCH(TYPE, FUNC, ARGS, MESSAGE) \ 2006 fprintf MESSAGE; \ 2007 return CALL_ ## FUNC(GET_DISPATCH(), ARGS); 2008 2009 *************** 2010 *** 74,80 **** 2011 #define DISPATCH(FUNC, ARGS, MESSAGE) \ 2012 CALL_ ## FUNC(GET_DISPATCH(), ARGS); 2013 2014 ! #define RETURN_DISPATCH(FUNC, ARGS, MESSAGE) \ 2015 return CALL_ ## FUNC(GET_DISPATCH(), ARGS); 2016 2017 #endif /* logging */ 2018 --- 74,80 ---- 2019 #define DISPATCH(FUNC, ARGS, MESSAGE) \ 2020 CALL_ ## FUNC(GET_DISPATCH(), ARGS); 2021 2022 ! #define RETURN_DISPATCH(TYPE, FUNC, ARGS, MESSAGE) \ 2023 return CALL_ ## FUNC(GET_DISPATCH(), ARGS); 2024 2025 #endif /* logging */ 2026 diff -c -r Mesa-7.9/src/mapi/glapi/glapi_nop.c MesaLib/src/mapi/glapi/glapi_nop.c 2027 *** Mesa-7.9/src/mapi/glapi/glapi_nop.c Mon Aug 15 09:14:30 2011 2028 --- MesaLib/src/mapi/glapi/glapi_nop.c Thu Aug 11 21:29:46 2011 2029 *************** 2030 *** 86,92 **** 2031 #define KEYWORD2 GLAPIENTRY 2032 #define NAME(func) NoOp##func 2033 #define DISPATCH(func, args, msg) Warn(#func); 2034 ! #define RETURN_DISPATCH(func, args, msg) Warn(#func); return 0 2035 2036 2037 /* 2038 --- 86,92 ---- 2039 #define KEYWORD2 GLAPIENTRY 2040 #define NAME(func) NoOp##func 2041 #define DISPATCH(func, args, msg) Warn(#func); 2042 ! #define RETURN_DISPATCH(type, func, args, msg) Warn(#func); return (type)0 2043 2044 2045 /* 2046 *************** 2047 *** 96,102 **** 2048 2049 #else 2050 2051 ! static int 2052 NoOpGeneric(void) 2053 { 2054 #if !defined(_WIN32_WCE) 2055 --- 96,102 ---- 2056 2057 #else 2058 2059 ! void 2060 NoOpGeneric(void) 2061 { 2062 #if !defined(_WIN32_WCE) 2063 *************** 2064 *** 104,110 **** 2065 fprintf(stderr, "GL User Error: calling GL function without a rendering context\n"); 2066 } 2067 #endif 2068 - return 0; 2069 } 2070 2071 /** 2072 --- 104,109 ---- 2073 *************** 2074 *** 113,119 **** 2075 static GLint 2076 NoOpUnused(void) 2077 { 2078 ! return NoOpGeneric(); 2079 } 2080 2081 /* 2082 --- 112,119 ---- 2083 static GLint 2084 NoOpUnused(void) 2085 { 2086 ! NoOpGeneric(); 2087 ! return 0; 2088 } 2089 2090 /* 2091 *************** 2092 *** 127,133 **** 2093 #define KEYWORD2 GLAPIENTRY 2094 #define NAME(func) NoOp##func 2095 #define DISPATCH(func, args, msg) NoOpGeneric(); 2096 ! #define RETURN_DISPATCH(func, args, msg) return NoOpGeneric(); 2097 2098 /* 2099 * Defines for the table of no-op entry points. 2100 --- 127,133 ---- 2101 #define KEYWORD2 GLAPIENTRY 2102 #define NAME(func) NoOp##func 2103 #define DISPATCH(func, args, msg) NoOpGeneric(); 2104 ! #define RETURN_DISPATCH(type, func, args, msg) NoOpGeneric(); return (type)0 2105 2106 /* 2107 * Defines for the table of no-op entry points. 2108