libClang parser and updated configuration framework
This MR modifies substantially the way configurations are parsed and generated in Allen.
- It uses libClang (http://clang.llvm.org/docs/Tooling.html, https://github.com/llvm-mirror/clang/blob/master/bindings/python/clang/cindex.py) to parse the entire Allen codebase and generate a python view of all algorithms.
- Pregenerated sequences lie now in
configuration/pregenerated/, both for.hand.jsonfiles.
The configuration generation is now integrated with the make process.
- Python sequences exist in
configuration/sequences/. - Each of the Python sequences can be identified by its name, such as
<sequence_name>.py. - The cmake option
SEQUENCEcan be specified to be one of these<sequence_name>. - cmake will then check that the generation process works (it should work if either
/cvmfs/sft.cern.chis available, or clang >= 9.0.0 is installed). - If the generation process works: When
makeis invoked, the specifiedSEQUENCEwill be generated. The resulting.hwill be used for compilation, and the resulting.jsonwill be copied to${PROJECT_BINARY_DIR}/Sequence.json. - If the generation process doesn't work: A warning is issued at cmake configuration time. When
makeis invoked, the specifiedSEQUENCEwill be copied (both.hand.json) from the pregenerated ones. Not finding said sequence will result in a compilation error. - Once Allen is compiled,
./Allenwill by default pick theSequence.jsonin its same folder.
Examples
Generating the default sequence, HLT1:
$ cmake ..
[...]
-- Testing code generation with LLVM
-- Testing code generation with LLVM - Success
[...]
$ make -j
[...]
Parsing algorithms...
Generating /home/dcampora/projects/allen/build/sequences/definitions/algorithms.py...
File /home/dcampora/projects/allen/build/sequences/definitions/algorithms.py was successfully generated.
Validating sequence...
Warning: OutputParameter "dev_sel_rb_substr_t" appears on algorithms: prepare_raw_banks_t, package_sel_reports_t
Warning: OutputParameter "dev_sel_rep_offsets_t" appears on algorithms: prefix_sum_sel_reps, package_sel_reports_t
Warning: OutputParameter "dev_atomics_muon_t" appears on algorithms: muon_pre_decoding_t, muon_add_coords_crossing_maps_t
Warning: OutputParameter "dev_kf_tracks_t" appears on algorithms: kalman_velo_only_t, kalman_pv_ipchi2_t
Warning: OutputParameter "dev_sel_rb_hits_t" appears on algorithms: prepare_raw_banks_t, package_sel_reports_t
Warning: OutputParameter "dev_ut_windows_layers_t" appears on algorithms: ut_search_windows_t, ut_select_velo_tracks_with_windows_t
Warning: OutputParameter "dev_sel_rb_objtyp_t" appears on algorithms: prepare_raw_banks_t, package_sel_reports_t
Warning: OutputParameter "dev_scifi_lf_tracks_t" appears on algorithms: lf_triplet_keep_best_t, lf_extend_tracks_x_t, lf_extend_tracks_uv_t, lf_quality_filter_length_t
Warning: OutputParameter "dev_sel_results_offsets_t" appears on algorithms: run_hlt1_t, run_postscale_t
Warning: OutputParameter "dev_dec_reports_t" appears on algorithms: prepare_decisions_t, prepare_raw_banks_t
Warning: OutputParameter "dev_scifi_lf_length_filtered_tracks_t" appears on algorithms: lf_quality_filter_length_t, lf_quality_filter_t
Warning: OutputParameter "dev_sel_results_t" appears on algorithms: run_hlt1_t, run_postscale_t
Warning: OutputParameter "dev_scifi_hits_t" appears on algorithms: scifi_pre_decode_v4_t, scifi_raw_bank_decoder_v4_t, scifi_direct_decoder_v4_t
Warning: OutputParameter "dev_muon_hits_t" appears on algorithms: muon_add_coords_crossing_maps_t, muon_sort_by_station_t
Warning: OutputParameter "dev_sel_rb_stdinfo_t" appears on algorithms: prepare_raw_banks_t, package_sel_reports_t
Warning: OutputParameter "dev_storage_tile_id_t" appears on algorithms: muon_pre_decoding_t, muon_sort_station_region_quarter_t, muon_add_coords_crossing_maps_t
Warning: OutputParameter "dev_storage_tdc_value_t" appears on algorithms: muon_pre_decoding_t, muon_sort_station_region_quarter_t, muon_add_coords_crossing_maps_t
Number of sequence warnings: 17
Generating sequence file...
Generated sequence file Sequence.h
Generating JSON configuration file...
Generated JSON configuration file Sequence.json
[ 57%] Built target configured_sequence
Changing the sequence:
cmake -DSEQUENCE=VELO ..
make -j
Example where generation is not available (CVMFS not available, and clang version < 9.0.0):
$ cmake ..
[...]
-- Testing code generation with LLVM
CMake Warning at stream/CMakeLists.txt:123 (message):
Testing code generation with LLVM - Failed. CVMFS (sft.cern.ch) or clang
>= 9.0.0 are required to be able to generate configurations.
[...]
$ make -j
[...]
[ 7%] Built target configured_sequence
[...]
Available sequences:
https://gitlab.cern.ch/lhcb/Allen/-/tree/dcampora_libtooling_parser/configuration%2Fsequences
Missing features:
- (Done) Ensure configurations are generated deterministically.
- (Done) The configuration is always updated, triggering a compilation, every time the sequence is changed, irrespective of whether the changes would only impact the
.json. This should be easily fixable by checking the configured header file is the same.
Known caveats:
- At present, include files are parsed without the c++ include files (option
-nostdinc++). Otherwise, some algorithms are not parsed correctly byclang.cindex. Seemingly this causes no issues in recognizing the parsed classes. A happy side effect is that this makes the parsing process faster. - No additional include folders (
-I) are added. The obvious candidate-Istream/gear/includeunfortunately makes parsing parameters much harder, and I did not find a way to properly traverse individual parameters (here is my last attempt). Instead, for these cases, the tokens are traversed. It is arguable whether this is more unsafe than using macros (ie. parameters and properties are still a comma-separated list of tokens after all). Adding-Istream/gear/includemakes parsing the tokens much harder as it converts the parameters block into a single list of tokens. - The
DeviceAlgorithmandHostAlgorithmclasses are not defined, and are therefore parsed as tokens. Including-Istream/gear/includesolves this at the cost of making parsing the parameters harder.
Edited by Daniel Hugo Campora Perez