major changes between 10.00 and 11.00

  • Removed support for complex math and <complex.h>. Only mandatory in C99, missed by "nobody", and really just complicating the compiler and other tools.
  • Added just a few needed definitions to Windows include files, like <wincrypt.h> and <richedit.h>.
  • Added pope.exe, for inspecting PE/COFF files (executable, object, and archive files).
  • Added simple command-line driver for the IDE source code formatter DLL (cformat.dll), cleverly named cformat.exe.
  • Added experimental support for new C runtime functions from the upcoming C2X standard. See help file for details.
  • Removed macro overrides for various C runtime functions (rather than calling an internal function with a parameter, they will now directly call the given runtime function).
  • Added some more checks for corrupt small block HEAP in malloc(), realloc(), and free().
  • Improved buffer allocation for open_memstream() and open_wmemstream() making them much faster for some usage patterns.
  • Since C11 made it clear that the FILE struct/object don't need to be complete in <stdio.h> (only a pointer to FILE is ever used), the completion of this type is now internal (even in C99 mode).
  • Similar to a change in version 10.00, increased the alignment for delay-loaded import sections on X64.
  • Fixed problem with gmtime_s() when using 64-bit time_t.

  • Added experimental support for some features from the upcoming C2X standard.
  • Added experimental support for searching (not replacing) using regular expressions.
  • Refactored identification by content of various file formats (attempting to fix some mis-identifications).
  • Refactored source code formatter DLL once more, but some Windows files still not looking great.
  • Refactored handling of ZIP/UNZIP for project/workspace. Impossible to make it foolproof, but at least the code is new.
  • Added attempt to handle certificate with SHA-256 in code signing. Hard to test without a real certificate, which I don't have (and not planning to get).
  • A few other minor improvements.

  • Added experimental support for some features from the upcoming C2X standard. See help file for details.
  • Dropped incomplete/unhelpful Spectre mitigations (the /spectre option now just gives a warning; to be removed later.)
  • Added hints for when a standard (and common) C runtime function, or type, is used without the appropriate #include file.
  • Added aggressive form of dead code elimination (essentially, before code had to demonstrate it was useless to be removed but now code must be deemed useful to stay).
    Not a huge deal for a sane program, but the following passage added to the C11 standard may come into play:

    "An iteration statement whose controlling expression is not a constant expression (an omitted controlling expression is replaced by a nonzero constant, which is a constant expression), that performs no input/output operations, does not access volatile objects, and performs no synchronization or atomic operations in its body, controlling expression, or (in the case of a for statement) its expression-3, may be assumed by the implementation to terminate (this is intended to allow compiler transformations such as removal of empty loops even when termination cannot be proven)."

  • Changed experimental value range pass from version 10.00 into a more useful on-demand value range evaluator (to be called when needed). Now used for many things from optimizations to warnings. Could probably do even more in the future.
  • Similar to the value range evaluator, there is now also an on-demand "known bits" evaluator. This evaluator can sometimes give better info about bit operations than value ranges.
  • Changed to a new, easier to understand, points-to analysis.
  • Thanks to the new points-to analysis, the alias analysis could also be made simpler.
  • Added new liveness analysis to the back end, slightly improving precision of the register and the stack-local allocators. This shouldn't affect the generated code much, but it makes the compiler more complete.
  • Also unoptimized code will now enter SSA form, but only for warnings, in the hope they will be more consistent between optimized and unoptimized (debug) builds.
  • Added new algorithm for detecting uninitialized local variables (same for optimized and unoptimized builds); local variables that are uninitialized on some code paths can still produce false positives, but this is hard to get rid of. The new algorithm is also used to more aggressive handling of __declspec(release()) annotations (use of dangling value after f.e. free()).
  • Added naive global value numbering pass. Not great, but still useful for some programs.
  • Added better internal representation of intrinsic functions with "output" parameters, like writing to memory or returning more than one value.
  • Added basic support for __assume(0) pseudo-intrinsic in Microsoft mode, and also some other forms of unreachable code annotations (but no "time travel" optimizations).
  • Revised loop unrolling to be less aggressive in order to avoid some code bloat. Without detailed instruction cost per processor model, which will never be added, this will always be a guessing game. At least the worst OMFG cases are now gone.
  • Added support for __declspec(selectany) on data objects.
  • Added compiler evaluation of more SIMD intrinsics with constant values.
  • Replaced some SIMD operations, previously handled by inline functions, with proper SIMD intrinsics.
  • Revised internal representation of, and warnings for, integer divide-by-zero and overflow.
  • Revised handling/spilling of tricky _mm256_zeroall() and _mm256_zeroupper().
  • Added stronger warning for narrowing pointer-to-integer conversion, but also added limited support for "double cast", like (DWORD)(DWORD_PTR)ptr, to reduce noise from some Windows API constructs.
  • Moved more of assert() handling to the compiler, to give it more control over string encodings, suppression of warnings, and to possibly help with optimizations in the future.
  • Various other improvements and bug fixes.

Macro assembler:
  • Added minimal support for UTF-8 encoded source files (with A BOM).
  • Fixed problem originally reported in the forum by "Vortex", which then triggered an small avalanche of fixes in the assembler (from error reporting to string handling functions). Interesting development for what initially seemed like a small problem.
  • Fixed assembler problem with "peek-ahead" in number parsing at end-of-file.
  • Added support for endbr32 and endbr64 instructions.
  • A few minor improvements and fixes.

  • Refactored support for COMDAT symbols.

Browse Info Manager:
  • Added experimental support for preprocessor directives #elifdef and #elifndef from the upcoming C2X standard.
  • Fixed problem with UTF-8 BOM detection.

Make Utility:
  • Added support for IDE workspace files (.ppw). At least useful to me, when rebuilding all tools from the command-line.

H-to-INC Converter:
  • Added experimental support for preprocessor directives #elifdef and #elifndef from the upcoming C2X standard.

Certificate Utility:
  • Switched to this weeks version of Cryptographic API functions from Microsoft (CNG). Seems to be the only way to properly support SHA-256 (and better). The meaning of some options have changed slightly.

Code Signing Utility:
  • Added attempt to handle SHA-256. Hard to test without a real certificate, which I don't have (and not planning to get).

Install builder:
  • The MessageBox statement no longer uses MessageBox() but TaskDialog(). Life sucks. Get over it.
  • Fixed problem with URLs and character encoding on License and Information pages.
  • Fixed problem with wildcards in SetFileAttributes statement.