@@ -107,28 +107,75 @@ loadDatabaseFromFile(Diagnostics &diagnostics, const std::string &path,
107
107
return database;
108
108
}
109
109
110
+ static std::map<std::string, std::vector<std::string>>
111
+ createBitcodeFlags (Diagnostics &diagnostics, CompilationDatabase::BitcodeFlags &bitcodeFlags,
112
+ const std::vector<std::string> &extraFlags) {
113
+ const std::map<std::string, std::string> &bitcodeFlagsMap = bitcodeFlags.getFlags ();
114
+
115
+ std::map<std::string, std::vector<std::string>> mergedBitcodeFlags;
116
+
117
+ for (auto const &bitcodeFileEntry : bitcodeFlagsMap) {
118
+ std::vector<std::string> fileFlagsArray = flagsFromString (bitcodeFileEntry.second );
119
+
120
+ fileFlagsArray = filterFlags (fileFlagsArray, true );
121
+
122
+ // / Remove file name from the list of flags
123
+ fileFlagsArray.erase (
124
+ std::remove (fileFlagsArray.begin (), fileFlagsArray.end (), bitcodeFileEntry.first ),
125
+ fileFlagsArray.end ());
126
+
127
+ for (const auto &extraFlag : extraFlags) {
128
+ fileFlagsArray.push_back (extraFlag);
129
+ }
130
+
131
+ mergedBitcodeFlags[bitcodeFileEntry.first ] = fileFlagsArray;
132
+ }
133
+
134
+ return mergedBitcodeFlags;
135
+ }
136
+
110
137
CompilationDatabase::CompilationDatabase (Diagnostics &diagnostics, CompilationDatabase::Path path,
111
- CompilationDatabase::Flags flags)
138
+ CompilationDatabase::Flags flags,
139
+ CompilationDatabase::BitcodeFlags bitcodeFlags)
112
140
: extraFlags(filterFlags(flagsFromString(flags.getFlags()), false)),
113
- database(loadDatabaseFromFile(diagnostics, path.getPath(), extraFlags)) {}
141
+ database(loadDatabaseFromFile(diagnostics, path.getPath(), extraFlags)),
142
+ bitcodeFlags(createBitcodeFlags(diagnostics, bitcodeFlags, extraFlags)) {}
114
143
115
144
const std::vector<std::string> &
116
145
CompilationDatabase::compilationFlagsForFile (const std::string &filepath) const {
117
- if (database.empty ()) {
146
+ if (database.empty () && bitcodeFlags. empty () ) {
118
147
return extraFlags;
119
148
}
120
149
121
- auto it = database.find (filepath);
122
- if (it != database.end ()) {
150
+ // / Look in bitcode flags
151
+ auto it = bitcodeFlags.find (filepath);
152
+ if (it != bitcodeFlags.end ()) {
123
153
return it->second ;
124
154
}
125
155
auto filename = llvm::sys::path::filename (filepath);
156
+ it = bitcodeFlags.find (filename);
157
+ if (it != bitcodeFlags.end ()) {
158
+ return it->second ;
159
+ }
160
+
161
+ llvm::SmallString<128 > dotlessPath (filepath);
162
+ llvm::sys::path::remove_dots (dotlessPath, true );
163
+ it = bitcodeFlags.find (dotlessPath.str ());
164
+ if (it != bitcodeFlags.end ()) {
165
+ return it->second ;
166
+ }
167
+
168
+ // / Look in compilation database
169
+ it = database.find (filepath);
170
+ if (it != database.end ()) {
171
+ return it->second ;
172
+ }
173
+ filename = llvm::sys::path::filename (filepath);
126
174
it = database.find (filename);
127
175
if (it != database.end ()) {
128
176
return it->second ;
129
177
}
130
178
131
- llvm::SmallString<128 > dotlessPath (filepath);
132
179
llvm::sys::path::remove_dots (dotlessPath, true );
133
180
it = database.find (dotlessPath.str ());
134
181
if (it != database.end ()) {
0 commit comments