• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

tudasc / TypeART / 25378734343

05 May 2026 01:17PM UTC coverage: 89.85% (-0.4%) from 90.246%
25378734343

Pull #188

github

web-flow
Merge 9ca0e8ae2 into 278119205
Pull Request #188: GPU memory allocation support

238 of 298 new or added lines in 20 files covered. (79.87%)

1 existing line in 1 file now uncovered.

5108 of 5685 relevant lines covered (89.85%)

45301.23 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

83.7
/lib/passes/configuration/PassConfiguration.cpp
1
// TypeART library
2
//
3
// Copyright (c) 2017-2026 TypeART Authors
4
// Distributed under the BSD 3-Clause license.
5
// (See accompanying file LICENSE.txt or copy at
6
// https://opensource.org/licenses/BSD-3-Clause)
7
//
8
// Project home: https://github.com/tudasc/TypeART
9
//
10
// SPDX-License-Identifier: BSD-3-Clause
11
//
12

13
#include "PassConfiguration.h"
14

15
#include "OptionsUtil.h"
16
#include "analysis/MemInstFinder.h"
17
#include "configuration/Configuration.h"
18
#include "instrumentation/TypeIDProvider.h"
19
#include "support/ConfigurationBase.h"
20
#include "support/ConfigurationBaseOptions.h"
21
#include "support/Error.h"
22
#include "support/Logger.h"
23

24
#include "llvm/Support/FormatVariadicDetails.h"
25

26
#include <llvm/Support/FormatVariadic.h>
27
#include <llvm/Support/raw_ostream.h>
28
#include <string>
29

30
namespace typeart::config::pass {
31

32
struct PassStdArgsEq final {
33
#define TYPEART_CONFIG_OPTION(name, path, type, def_value, description, upper_path) \
34
  static constexpr char name[] = path "=";
35
#include "support/ConfigurationBaseOptions.h"
36
#undef TYPEART_CONFIG_OPTION
37
};
38

39
llvm::Expected<TypeARTConfigOptions> parse_typeart_config(llvm::StringRef parameters) {
11,922✔
40
  return parse_typeart_config_with_occurrence(parameters).first;
11,922✔
41
}
×
42

43
PassConfig parse_typeart_config_with_occurrence(llvm::StringRef parameters) {
25,280✔
44
  LOG_DEBUG("Parsing string: " << parameters)
45
  TypeARTConfigOptions result;
25,280✔
46
  OptOccurrenceMap occurrence_map;
25,280✔
47
  bool global_set{false};
25,280✔
48
  bool stack_set{false};
25,280✔
49

50
  while (!parameters.empty()) {
55,344✔
51
    llvm::StringRef parameter_name;
30,064✔
52
    std::tie(parameter_name, parameters) = parameters.split(';');
30,064✔
53

54
    const bool enable = !parameter_name.consume_front("no-");
30,064✔
55

56
    if (parameter_name == ConfigStdArgs::heap) {
30,064✔
57
      result.heap                         = enable;
6,872✔
58
      occurrence_map[ConfigStdArgs::heap] = true;
6,872✔
59
      continue;
6,872✔
60
    }
61

62
    if (parameter_name == ConfigStdArgs::gpu) {
23,192✔
NEW
63
      result.gpu                         = enable;
×
NEW
64
      occurrence_map[ConfigStdArgs::gpu] = true;
×
NEW
65
      continue;
×
66
    }
67

68
    if (parameter_name == ConfigStdArgs::stack) {
23,192✔
69
      result.stack                         = enable;
3,508✔
70
      occurrence_map[ConfigStdArgs::stack] = true;
3,508✔
71
      stack_set                            = true;
3,508✔
72
      continue;
3,508✔
73
    }
74

75
    if (parameter_name == ConfigStdArgs::global) {
19,684✔
76
      global_set                            = true;
48✔
77
      result.global                         = enable;
48✔
78
      occurrence_map[ConfigStdArgs::global] = true;
48✔
79
      continue;
48✔
80
    }
81

82
    if (parameter_name == ConfigStdArgs::filter) {
19,636✔
83
      result.filter                         = enable;
48✔
84
      occurrence_map[ConfigStdArgs::filter] = true;
48✔
85
      continue;
48✔
86
    }
87

88
    if (parameter_name == ConfigStdArgs::stats) {
19,588✔
89
      result.statistics                    = enable;
11,994✔
90
      occurrence_map[ConfigStdArgs::stats] = true;
11,994✔
91
      continue;
11,994✔
92
    }
93

94
    if (parameter_name == ConfigStdArgs::stack_lifetime) {
7,594✔
95
      result.stack_lifetime                         = enable;
120✔
96
      occurrence_map[ConfigStdArgs::stack_lifetime] = true;
120✔
97
      continue;
120✔
98
    }
99

100
    if (parameter_name.consume_front(PassStdArgsEq::typegen)) {
7,474✔
101
      result.typegen                         = util::string_to_enum<TypegenImplementation>(parameter_name);
5,746✔
102
      occurrence_map[ConfigStdArgs::typegen] = true;
5,746✔
103
      continue;
5,746✔
104
    }
105

106
    if (parameter_name.consume_front(PassStdArgsEq::filter_impl)) {
1,728✔
107
      result.filter_config.implementation        = util::string_to_enum<analysis::FilterImplementation>(parameter_name);
48✔
108
      occurrence_map[ConfigStdArgs::filter_impl] = true;
48✔
109
      continue;
48✔
110
    }
111

112
    if (parameter_name.consume_front(PassStdArgsEq::type_serialization)) {
1,680✔
113
      result.type_serialization = util::string_to_enum<TypeSerializationImplementation>(parameter_name);
1,440✔
114
      occurrence_map[ConfigStdArgs::type_serialization] = true;
1,440✔
115
      continue;
1,440✔
116
    }
117

118
    if (parameter_name.consume_front(PassStdArgsEq::filter_glob)) {
240✔
119
      result.filter_config.glob                  = parameter_name;
48✔
120
      occurrence_map[ConfigStdArgs::filter_glob] = true;
48✔
121
      continue;
48✔
122
    }
123
    if (parameter_name.consume_front(PassStdArgsEq::filter_glob_deep)) {
192✔
124
      result.filter_config.glob_deep                  = parameter_name;
×
125
      occurrence_map[ConfigStdArgs::filter_glob_deep] = true;
×
126
      continue;
×
127
    }
128
    if (parameter_name == ConfigStdArgs::analysis_filter_global) {
192✔
129
      result.analysis_config.filter_global                  = enable;
48✔
130
      occurrence_map[ConfigStdArgs::analysis_filter_global] = true;
48✔
131
      continue;
48✔
132
    }
133

134
    if (parameter_name == ConfigStdArgs::analysis_filter_alloca_non_array) {
144✔
135
      result.analysis_config.filter_alloca_non_array                  = enable;
48✔
136
      occurrence_map[ConfigStdArgs::analysis_filter_alloca_non_array] = true;
48✔
137
      continue;
48✔
138
    }
139

140
    if (parameter_name == ConfigStdArgs::analysis_filter_heap_alloc) {
96✔
141
      result.analysis_config.filter_heap_alloc                  = enable;
48✔
142
      occurrence_map[ConfigStdArgs::analysis_filter_heap_alloc] = true;
48✔
143
      continue;
48✔
144
    }
145

146
    if (parameter_name == ConfigStdArgs::analysis_filter_pointer_alloc) {
48✔
147
      result.analysis_config.filter_pointer_alloc                  = enable;
48✔
148
      occurrence_map[ConfigStdArgs::analysis_filter_pointer_alloc] = true;
48✔
149
      continue;
48✔
150
    }
151
    {
152
      // undefined symbol issue: llvm::formatv("Unknown TypeART option {0} with unparsed list {1}", parameter_name,
153
      // parameters).str()
154
      std::string out_string;
×
155
      llvm::raw_string_ostream out_stream(out_string);
×
156
      out_stream << "Unknown TypeART option " << parameter_name;
×
157
      if (!parameters.empty()) {
×
158
        out_stream << " with unparsed list " << parameters;
×
159
      }
×
160
      return {error::make_string_error(out_stream.str()), occurrence_map};
×
161
    }
×
162
  }
163
  if (!global_set && stack_set) {
25,280✔
164
    // Stack implies global
165
    result.global                         = result.stack;
3,460✔
166
    occurrence_map[ConfigStdArgs::global] = true;
3,460✔
167
  }
3,460✔
168
  return {result, occurrence_map};
25,280✔
169
}
25,280✔
170

171
}  // namespace typeart::config::pass
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc