a³ release 18.10

New targets and compilers



  • aiT for ARM now supports Cortex-M0 (STM32F0DISCOVERY)
  • All tools for ARM now support the Wind River Diab C/C++ ARM compiler and LLVM/Clang-based compilers. This also includes support for the HighTec ARM toolchain.
  • All tools for x86 now support LLVM/Clang-based compilers.
  • The C++ Call Target Analyzer now also uses the LLVM/Clang 7 toolchain.

Improved performance

  • Decoding is now combined with the stack/value analysis into a single analysis phase, refered to as the Instruction Stream Analyzer (ISA).
  • Optimized memory usage of the GUI and improved performance of Statistics views.
  • Improved handling of large XTC files, and of XTC files with multiple requests per CPU.
  • Improved performance for projects with many analyses, and improved feedback during loading of large projects.

Extended DWARF support

  • Added support for DWARFv5.
  • The debug information is now read significantly faster, especially for C++.
  • Improved handling of broken debug information.
  • The DWARF view now shows all class, structure, typedef and union types.
  • The base type names in the debug information are now normalized to be consistent across different platforms and compilers.

Unified context settings

The default context specification is now the same for all analyses:

mapping {
  max length: 2;
  default unroll: 2;
}

Previously, the defaults were:

# stack analysis

mapping {
  max length: 2;
  default unroll: 1;
}
# all other analyses except TimeWeaver

mapping {
  max length: inf;
  default unroll: 2;
}

You can use the above annotations to switch back to the old settings if needed.

Qualification Support Kits

  • New compiler-specific QSK for StackAnalyzer for ARM with GCC 4.7.4
  • Enhanced qk_ais2_condition_values to additionally cover imprecise expressions as condition value.
  • New test cases:
    • qk_setting_restrict_accesses_via_dwarf
    • qk_setting_size_limit_reads, qk_setting_size_limit_writes
    • qk_setting_stack_analysis_mode
    • qk_setting_stack_area
    • qk_setting_value_set_size_limit
    • qk_setting_widening_delay
  • Fixed TOR and VTP report buttons in the Qualification dialog for ARM-related packages.

Analysis handling

  • The message history now only goes back one analysis run by default. History size can be configured under Preferences → Project.
  • The result of an analysis can now be set as the expected result for future analyses from the Context menu in the analysis overview.
  • Interactive pipeline analysis is now disabled by default, and can be enabled under Setup → Timing analysis.
  • Improved indication of which and how many analyses are running in interactive mode.

Statistics views

  • Improved performance.
  • Extended TimeWeaver statistics: polar chart view for trace segments and duration of interrupts.

Visualization & results

  • Improved displaying of the widening effects in the interactive value analysis.
  • Improved source code visualization in result graph.
  • Improved source code visualization for inlined code snippets.
  • --export-workspace now works in GUI batch mode (-B).
  • The result graph is no longer opened automatically for interactive analyses, to not disturb the workflow.

Reporting

Loop bound information is now only shown for reachable loop contexts. For example, the following output from an older release:

Loop 'Proc0.L1': fully unrolled (context '0x80001088->"dhry", 0x800003a2->"Proc0", 0x80000430->"Proc0.L3"[1]') with [2] iterations
Loop 'Proc0.L1': fully unrolled (context '0x80001088->"dhry", 0x800003a2->"Proc0", 0x80000430->"Proc0.L3"[2..]') with [0] iterations
Loop 'Proc0.L2': libloopy matches (context '0x80001088->"dhry", 0x800003a2->"Proc0", 0x80000430->"Proc0.L3"[1]') with [3] iterations
Loop 'Proc0.L2': fully unrolled (context '0x80001088->"dhry", 0x800003a2->"Proc0", 0x80000430->"Proc0.L3"[2..]') with [0] iterations

is now reduced to the much cleaner:

Loop 'Proc0.L1': fully unrolled in all contexts with [2] iterations
Loop 'Proc0.L2': libloopy matches in all contexts with [3] iterations

Infeasible loop contexts will be ignored for later reporting in loop bound GUI and report statistics, too.

ResultCombinator

  • New operator sum(@GROUPID) to sum up the results of all items within an analysis group.
  • ResultCombinator now also supports TimeWeaver analyses.

General improvements

  • Improved memory usage of the GUI.
  • Improved performance for projects with many analyses.
  • Improved feedback during loading of large projects.
  • Improved performance for large XTC files.
  • Improved handling of XTC files containing multiple requests per CPU.
  • Improved usability of the "Restrict XML tags" tree view.
  • Improved handling of annotation locations for duplicated instructions.
  • Improved "show source" for loops.
  • Introduced "Add annotation" context menu entry for context-based statistic views, such as "WCET (context)".
  • Improved input field for multiple executables.
  • Improved progress reporting during starting of analyses for large projects.
  • Improved syntax highlighting for C/C++ and the AbsInt annotation languages.
  • Improved search in view for XML files.
  • Disassembly view shows the existence of code holes and their content.

AIS2

  • New functors:
    • index_of_parameter(<name>) to determine the index of a parameter,
    • number_of_parameters() to determine the number of parameters of a routine

    The information is taken from function definitions found in the DWARF debug information (if available).

    Example:

    # assert that the last parameter of a function is called n
    
    routine "tableLookup" {
      assert enter with: index_of_parameter("n") == (number_of_parameters() - 1);
    }
  • New annotation scope: you can now specify for-loops in AIS2 to annotate memory area contents that depend on the array element index. Example:
    # provide memory contents for dynamically initialized data structure
    
    for ("index" : 0 to entries("MK_taskCfgTable") - 1) {
      area (("MK_taskCfgTable"[] { index: var("index"); } ."nu")) {
        contains data: var("index");
      }
    }
  • The default context specification is now the same for all analyses:
    mapping {
      max length: 2;
      default unroll: 2;
    }
    Previously, the default for stack analysis was
    mapping {
      max length: 2;
      default unroll: 1;
    }
    and for all other analyses except TimeWeaver, it was
    mapping {
      max length: inf;
      default unroll: 2;
    }
    You can use the above annotations to switch back to the old settings if needed.
  • TriCore: more memory properties are now annotated automatically.

Instruction Stream Analyzer

The decoding, stack analysis and value analysis are now combined into a single analysis phase, refered to as the Instruction Stream Analyzer (ISA).

For XML reports, decode, value_analysis, and stack_analysis are now all united in cfg_value_analysis.

Stack and value analysis

  • Higher precision of the value analysis, thanks to improved widening. It now collects comparisons and only tries to widen up to the guaranteed bound.
  • Higher precision for callee-save register handling.
  • Improved sharpening via relational information for user-annotated memory cells.
  • Improved handling of external routines, keep calling contexts separated for them to avoid imprecision.
  • The decoder checks if computed (tail) calls hit functions with different signatures and reports this accordingly.
  • Improved heuristics to resolve computed calls via arrays using DWARF debug information.
  • Improved precision of relational analysis by exploiting more equivalence information.
  • Improved loop analysis for loops with counters in memory.
  • Improved iterative decoding if the control flow targets are aligned. If symbols are known for the aligned targets, they will be kept separate like for sets of constants.
  • Improved precision of stack relative memory information.
  • When data is read from writable or unreadable sections, the decoder provides an additional hint to declare the accessed area as volatile. Declaring memory areas as volatile prevents the decoder from accessing their data to reconstruct the control flow.
  • ARM:
    • Added support for ARMv8 AArch32 instructions.
    • Added support for cryptographic extension in AArch64 mode.
    • General improvements of the decoder, and improved switch table decoding for GCC specifically.
    • Improved handling of guarded execution.
    • Improved target alignment for indirect branches with mode switch.
  • C16x: improved precision of CP update handling.
  • PowerPC: improved switch table decoding.
  • TriCore: improved handling of switch tables.
  • V850:
    • Improved decoding of computed returns.
    • Improved SDA guessing for GHS.
    • FERET and EIRET now handled as end of program.

Cache and pipeline analysis

  • Improve performance of generic TimingProfiler pipeline.
  • Improve memory consumption and analysis time for large tasks with short call-string settings.
  • RH850: Improved timing analysis for data flash accesses.

C++ Call Target Analyzer

Now using the LLVM/Clang 7 toolchain.

Trace conversion

  • Support for the Infineon MTV TAB trace format.
  • Interactive MCDS tracing via Infineon DAS on TriCore AURIX devices.
  • Improved interrupt handling and trace coverage for PPC NEXUS traces.
  • Task switches can now be detected by specifying the memory cell that contains the current active task ID. You can specify using the global attribute running_task:
    attribute "running_task": address(("osKernelVariables"."ossActiveTaskIndex"));
  • Routines can now be excluded from the analysis using the annotation not analyzed. The analysis then only considers the trace time for these routines.
  • Traps are now handled like external routines.
  • Improved handling for the GHS code factor optimization.

TimeWeaver analysis

  • Performance improvements for trace-based path analysis.
  • Improved loop scaling conflict detection.
  • Traced execution times spent inside routines declared as external (using not analyzed) are now accounted for the annotated routine instead of the calling routine.
  • Implemented support for overriding traced execution times of not-analyzed routines via the takes annotation.
  • The analysis results can now be used in ResultCombinator.

Extended statistics

TimeWeaver statistics now include a polar chart view for trace segment and duration of interrupts.