changes between 2.90.1 and 3.00.0

    General:
  • Added mshtml.h, mshtmlc.h, dimm.h, schemadef.h, tmschema.h (thank you, Alex!) and intrin.h to the distribution. Updated dsadmin.h, commdlg.h.
  • Added C language reference to the help file.


  • IDE:
  • Added support for better indenting, converting to 'formatted C code', and inserting spaces, rather than tabs, in the source editor; Added new page in Options dialog for setting preferences about this.
  • Added support for setting additional include and library folders per project.
  • Faster loading of large projects when browse information is enabled.
  • Added new Import eMbedded Visual C++ project wizard. Several enhancements and bugfixes in Import MSVC project wizard.
  • Added Open containing folder in context menu for MDI document tabs.
  • Added context help for C keywords in the source editor.
  • Added help sub-menu with some web links.
  • The debugger will now use exported symbols for modules without debugging info.
  • Added support for custom resource types.
  • Added support for message tables - both as resources and as binary files (MSG*.BIN).
  • Added more add-in stuff: support for building custom file types, commands can be attached to more menus, resources can be located, added, deleted and/or updated.
  • Several minor enhancements added, and potential bugs fixed.


  • Compiler:
  • Added more C99 support:
    1. Initializers with automatic storage don't need to be constant.
    2. Designated initializers are now supported. Works for compound literals too. Known limitations: bitfields must still have constant initializers.

      Examples:
      int arr1[] = { 0, 0, 0, 0, 0, 0, 1, 2 };
      ...is same as this...
      int arr1[] = { [7] = 2, [6] = 1 };

      this work too...
      struct { int a[3], b; } w[] = { [0].a = {1}, [1].a[0] = 2 };
      ...and this...
      enum { member_one, member_two }; const char *nm[] = { [member_two] = "member two", [member_one] = "member one", };
      ...and this (a bit silly)...
      some_function(&(struct { int x; int y; }){ .y = y1, .x = x1 });

  • Small structures (sizeof struct is 1, 2, 4 or 8) will be optimized like in the Microsoft compiler. This will matter if you are calling a function that returns a structure, since the internal "calling convention" have changed. Calling a function like GetLargestConsoleWindowSize(), that is declared by Microsoft to return a (small) structure, will not work with previous versions of Pelles C. The change will also affect some C runtime functions, like div() and ldiv() - so make sure you are not mixing old and new versions of object files, C runtime libraries and so on.
  • Expressions will now be reordered, in an attempt to avoid "Floating-point expression too complex" errors. This will affect some integer expressions too.
  • Wide character string literals ("Unicode" strings) will now be pooled too - like character string literals.
  • Added support for #pragma code_page() - used when translating wide character string literals.
  • Added #pragma lib "name" as an alias for #pragma comment(lib, "name")
  • Added support for special Microsoft preprocessor token pasting /##/.
  • Added support for "extended relocations" - it's now possible to have more than 65,535 relocations for a section.
  • The ARM backend now support 64-bit long long integers (previously, long long was 32 bits).
  • Tried even harder to avoid "offset too big" errors from the ARM assembler.
  • Intrinsic functions _cpuid, wcslen and wcscpy added.
  • The compiler will now accept the keywords _forceinline and __forceinline - without doing much special.
  • Using L#string, to build wide character string literals, should now work like in other compilers (read Microsoft).
  • Added several new optimizations, including faster integer division.
  • Unknown __declspec attributes will now only cause a warning in Microsoft mode, not an error.
  • Added more checks and restrictions for __fastcall functions. Added support for __LOCAL_SIZE symbol.
  • Added warning about line-folding inside single line comment (//).
  • Added more warnings about overflow in constant expressions.
  • Added support for st and st(n) floating-point register names in the assembler.


  • Linker:
  • Added support for multiple resource files (not unlimited - but close enough).
  • Will now use the Windows temporary file directory when building the output files.
  • Sections in object files, without specific access flags, will be assigned the default value: data, read-write. This can only happen with buggy external tools.


  • Bugs:
  • Bugfix: inline functions, that referenced other inline functions or global variables, could sometimes leave the referenced items hanging around, even though the original inline function wasn't used.
  • Bugfix: some intrinsic functions, like memset(), could trigger "Expression with no effect removed" warning.
  • Bugfix: switching between different optimizing strategies, within the same source file, didn't work well.
  • Bugfix: converting a long long to _Bool should now work correctly.
  • Bugfix: signed and unsigned division could sometimes cause an internal error in best_spillee. The same could happen for __fastcall functions using char variables.
  • Bugfix: Triggering an exception will trash some processor registers, possibly destroying some 'register' variables. The optimizer will now turn off register allocation for functions containing __try -- _except or __try -- __finally.
  • Bugfix: Declarations immediately after a label is now allowed.
  • Bugfix: The ARM backend had problems with some negative constants.
  • Bugfix: Fixed a small ARM disassembler bug in PODUMP. Also modified the search strategy for source code files.
  • Bugfix: The timezone values in localtime() and _ftime() was wrong. The daylight saving time zone flag should now be set correctly.
  • Bugfix: Preprocessor concatenations like Do##Str##() should now work.
  • Bugfix: Calling a function that returned an unsigned value that required integer promotion, without using the returned value, generated a bad warning.
  • Bugfix: Invalid code like "if (1()) ..." could trigger a compiler exception.
  • Bugfix: Assigning a NULL pointer constant to a function pointer generated a bad warning.
  • Bugfix: Using the _asm keyword inside a _asm block generated an endless loop.
  • Bugfix: Some inline assembler instructions generated errors when accessing C variables.
  • Bugfix: The compiler emitted two linefeeds for every displayed warning or error message. Should also be fixed for the other command line tools.
  • Bugfix: Using the very last page in the small-block heap (when it was nearly full) could return a bad pointer that would eventually result in an exception.
  • Bugfix: Using a function prototype without __declspec(dllimport), followed by a prototype with __declspec(dllimport), generated bad code.
  • Bugfix: Fixed several problems in POMAKE regarding empty commands and special attributes (-,+,@).
  • Bugfix: Fixed a directive buffer limit in the assembler that, for example, could truncate very long external identifiers.
  • Bugfix: Problem with compiler overwriting one __fastcall function argument, while evaluating another argument - possibly fixed.
  • Bugfix: The IDE had problems with backup files with the same name, but in different directories.
  • Bugfix: The dialog editor didn't correctly handle text in custom controls.
  • Bugfix: The IDE will now check better about which files can be added to a project.
  • Bugfix: Fixed several problems with 'order controls' in the dialog editor.
  • Bugfix: Problem selecting drag handles for controls inside groupbox controls (related to 'order controls').
  • Bugfix: Problem in project settings, when parsing compiler options with spaces before argument (/I and /Fo).
  • Bugfix: Import resource will now check for disallowed duplicate resources.
  • Bugfix: An old macro definition in setjmp.h caused a linker error on Pocket PC.