Directory: | ./ |
---|---|
File: | src/BackEnd/backend.cpp |
Date: | 2025-03-14 12:14:21 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 127 | 133 | 95.5% |
Branches: | 245 | 295 | 83.1% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | /*************************************** | ||
2 | Auteur : Pierre Aubert | ||
3 | Mail : pierre.aubert@lapp.in2p3.fr | ||
4 | Licence : CeCILL-C | ||
5 | ****************************************/ | ||
6 | |||
7 | #include "backend.h" | ||
8 | |||
9 | ///Get the licence in string | ||
10 | /** @return licence in string | ||
11 | */ | ||
12 | 12 | PString cpp_licenceSaveStr(){ | |
13 | 12 | PString body(""); | |
14 |
1/1✓ Branch 1 taken 12 times.
|
12 | body += "/***************************************\n"; |
15 |
1/1✓ Branch 1 taken 12 times.
|
12 | body += "\tAuteur : Pierre Aubert\n"; |
16 |
1/1✓ Branch 1 taken 12 times.
|
12 | body += "\tMail : pierre.aubert@lapp.in2p3.fr\n"; |
17 |
1/1✓ Branch 1 taken 12 times.
|
12 | body += "\tLicence : CeCILL-C\n"; |
18 |
1/1✓ Branch 1 taken 12 times.
|
12 | body += "****************************************/\n\n\n"; |
19 | |||
20 |
1/1✓ Branch 1 taken 12 times.
|
12 | body += "//Warning : this file has been generated automatically by the phoenix_hpc_proxy program\n"; |
21 |
1/1✓ Branch 1 taken 12 times.
|
12 | body += "//You can find it at https://gitlab.in2p3.fr/CTA-LAPP/PHOENIX_LIBS/PhoenixHPCProxy\n"; |
22 |
1/1✓ Branch 1 taken 12 times.
|
12 | body += "//Do NOT modify it\n\n\n"; |
23 | 12 | return body; | |
24 | } | ||
25 | |||
26 | ///Get the handle name of the given function | ||
27 | /** @param functionName : function name | ||
28 | * @return corresponding function name | ||
29 | */ | ||
30 | 12 | PString getHandleFunction(const PString & functionName){ | |
31 |
1/1✓ Branch 2 taken 12 times.
|
24 | return "handle_" + functionName; |
32 | } | ||
33 | |||
34 | ///Get the handle type name of the given function | ||
35 | /** @param functionName : function name | ||
36 | * @return corresponding function name | ||
37 | */ | ||
38 | 12 | PString getHandleFunctionType(const PString & functionName){ | |
39 |
1/1✓ Branch 2 taken 12 times.
|
24 | return "FunctionTypehandle_" + functionName; |
40 | } | ||
41 | |||
42 | ///Get the update type name of the given file | ||
43 | /** @param fileName : file name | ||
44 | * @return corresponding function name | ||
45 | */ | ||
46 | 9 | PString getUpdateFunction(const PPath & fileName){ | |
47 |
2/2✓ Branch 2 taken 9 times.
✓ Branch 5 taken 9 times.
|
18 | return "update_" + fileName.eraseExtension(); |
48 | } | ||
49 | |||
50 | ///Save the function prototype as an inline function | ||
51 | /** @param function : PFunction to be used | ||
52 | * @return corresponding string | ||
53 | */ | ||
54 | 12 | PString cpp_backendTableHeaderInline(PFunction & function){ | |
55 |
6/6✓ Branch 1 taken 12 times.
✓ Branch 4 taken 12 times.
✓ Branch 6 taken 9 times.
✓ Branch 7 taken 3 times.
✓ Branch 9 taken 9 times.
✓ Branch 12 taken 9 times.
|
12 | if(function.getOtherCode() != ""){return function.getOtherCode();} |
56 |
1/1✓ Branch 1 taken 3 times.
|
3 | PString body(""); |
57 |
3/8✓ Branch 1 taken 3 times.
✓ Branch 4 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
|
3 | if(function.getDocString() != ""){body += function.getDocString();} |
58 |
3/8✓ Branch 1 taken 3 times.
✓ Branch 4 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
|
3 | if(function.getTemplateDef() != ""){body += function.getTemplateDef();} |
59 |
7/7✓ Branch 1 taken 3 times.
✓ Branch 4 taken 3 times.
✓ Branch 7 taken 3 times.
✓ Branch 10 taken 3 times.
✓ Branch 13 taken 3 times.
✓ Branch 16 taken 3 times.
✓ Branch 19 taken 3 times.
|
3 | body += "inline " + function.getOutputType() + " " + function.getName() + "("; |
60 | 3 | bool isComma(false); | |
61 |
1/1✓ Branch 1 taken 3 times.
|
3 | PVecArgument & vecArg = function.getVecArgument(); |
62 |
2/2✓ Branch 3 taken 12 times.
✓ Branch 4 taken 3 times.
|
15 | for(PVecArgument::iterator it(vecArg.begin()); it != vecArg.end(); ++it){ |
63 |
3/3✓ Branch 0 taken 9 times.
✓ Branch 1 taken 3 times.
✓ Branch 3 taken 9 times.
|
12 | if(isComma){body += ", ";} |
64 |
3/3✓ Branch 2 taken 12 times.
✓ Branch 5 taken 12 times.
✓ Branch 8 taken 12 times.
|
12 | body += it->getType() + " "; |
65 |
7/7✓ Branch 2 taken 12 times.
✓ Branch 5 taken 12 times.
✓ Branch 7 taken 9 times.
✓ Branch 8 taken 3 times.
✓ Branch 11 taken 9 times.
✓ Branch 14 taken 9 times.
✓ Branch 17 taken 9 times.
|
12 | if(it->getPtrRef() != ""){body += it->getPtrRef() + " ";} |
66 |
2/2✓ Branch 2 taken 12 times.
✓ Branch 5 taken 12 times.
|
12 | body += it->getName(); |
67 |
3/10✓ Branch 2 taken 12 times.
✓ Branch 5 taken 12 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 12 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
|
12 | if(it->getDefaultValue() != ""){body += " = " + it->getDefaultValue();} |
68 | 12 | isComma = true; | |
69 | } | ||
70 |
1/1✓ Branch 1 taken 3 times.
|
3 | body += "){\n"; |
71 | 3 | isComma = false; | |
72 |
5/5✓ Branch 1 taken 3 times.
✓ Branch 4 taken 3 times.
✓ Branch 7 taken 3 times.
✓ Branch 10 taken 3 times.
✓ Branch 13 taken 3 times.
|
3 | body += "\t"+getHandleFunction(function.getName())+"("; |
73 |
2/2✓ Branch 3 taken 12 times.
✓ Branch 4 taken 3 times.
|
15 | for(PVecArgument::iterator it(vecArg.begin()); it != vecArg.end(); ++it){ |
74 |
3/3✓ Branch 0 taken 9 times.
✓ Branch 1 taken 3 times.
✓ Branch 3 taken 9 times.
|
12 | if(isComma){body += ", ";} |
75 |
2/2✓ Branch 2 taken 12 times.
✓ Branch 5 taken 12 times.
|
12 | body += it->getName(); |
76 | 12 | isComma = true; | |
77 | } | ||
78 |
1/1✓ Branch 1 taken 3 times.
|
3 | body += ");\n"; |
79 |
1/1✓ Branch 1 taken 3 times.
|
3 | body += "}\n\n"; |
80 |
1/1✓ Branch 1 taken 3 times.
|
3 | return body; |
81 | 3 | } | |
82 | |||
83 | ///Save the function prototype as an inline function | ||
84 | /** @param function : PFunction to be used | ||
85 | * @return corresponding string | ||
86 | */ | ||
87 | 12 | PString cpp_backendTableHeaderHandleType(PFunction & function){ | |
88 |
4/4✓ Branch 1 taken 12 times.
✓ Branch 3 taken 9 times.
✓ Branch 4 taken 3 times.
✓ Branch 6 taken 9 times.
|
12 | if(!repr_isFunction(function)){return "";} |
89 |
1/1✓ Branch 1 taken 3 times.
|
3 | PString body(""); |
90 |
8/8✓ Branch 1 taken 3 times.
✓ Branch 4 taken 3 times.
✓ Branch 7 taken 3 times.
✓ Branch 10 taken 3 times.
✓ Branch 13 taken 3 times.
✓ Branch 16 taken 3 times.
✓ Branch 19 taken 3 times.
✓ Branch 22 taken 3 times.
|
3 | body += "typedef " + function.getOutputType() + "(*" + getHandleFunctionType(function.getName()) + ")("; |
91 | 3 | bool isComma(false); | |
92 |
1/1✓ Branch 1 taken 3 times.
|
3 | PVecArgument & vecArg = function.getVecArgument(); |
93 |
2/2✓ Branch 3 taken 12 times.
✓ Branch 4 taken 3 times.
|
15 | for(PVecArgument::iterator it(vecArg.begin()); it != vecArg.end(); ++it){ |
94 |
3/3✓ Branch 0 taken 9 times.
✓ Branch 1 taken 3 times.
✓ Branch 3 taken 9 times.
|
12 | if(isComma){body += ", ";} |
95 |
2/2✓ Branch 2 taken 12 times.
✓ Branch 5 taken 12 times.
|
12 | body += it->getType(); |
96 |
7/7✓ Branch 2 taken 12 times.
✓ Branch 5 taken 12 times.
✓ Branch 7 taken 9 times.
✓ Branch 8 taken 3 times.
✓ Branch 11 taken 9 times.
✓ Branch 14 taken 9 times.
✓ Branch 17 taken 9 times.
|
12 | if(it->getPtrRef() != ""){body += " " + it->getPtrRef();} |
97 | 12 | isComma = true; | |
98 | } | ||
99 |
1/1✓ Branch 1 taken 3 times.
|
3 | body += ");\n"; |
100 |
1/1✓ Branch 1 taken 3 times.
|
3 | return body; |
101 | 3 | } | |
102 | |||
103 | ///Save the header of the given PSource | ||
104 | /** @param source : PSource to be used | ||
105 | * @return corresponding string | ||
106 | */ | ||
107 | 3 | PString cpp_backendHeader(PSource & source){ | |
108 |
1/1✓ Branch 1 taken 3 times.
|
3 | PString body(cpp_licenceSaveStr()); |
109 |
6/6✓ Branch 1 taken 3 times.
✓ Branch 4 taken 3 times.
✓ Branch 7 taken 3 times.
✓ Branch 10 taken 3 times.
✓ Branch 13 taken 3 times.
✓ Branch 16 taken 3 times.
|
6 | PString baseMacro("__" + source.getName().eraseExtension().toUpper() + "_PROXY_H__"); |
110 |
3/3✓ Branch 1 taken 3 times.
✓ Branch 4 taken 3 times.
✓ Branch 7 taken 3 times.
|
3 | body += "#ifndef " + baseMacro + "\n"; |
111 |
3/3✓ Branch 1 taken 3 times.
✓ Branch 4 taken 3 times.
✓ Branch 7 taken 3 times.
|
3 | body += "#define " + baseMacro + "\n\n"; |
112 |
1/1✓ Branch 1 taken 3 times.
|
3 | body += "#include <iostream>\n\n\n"; |
113 |
1/1✓ Branch 1 taken 3 times.
|
3 | PVecFunction & vecFunction = source.getVecFunction(); |
114 |
2/2✓ Branch 3 taken 12 times.
✓ Branch 4 taken 3 times.
|
15 | for(PVecFunction::iterator it(vecFunction.begin()); it != vecFunction.end(); ++it){ |
115 |
2/2✓ Branch 2 taken 12 times.
✓ Branch 5 taken 12 times.
|
12 | body += cpp_backendTableHeaderHandleType(*it); |
116 | } | ||
117 |
1/1✓ Branch 1 taken 3 times.
|
3 | body += "\n\n"; |
118 |
2/2✓ Branch 4 taken 12 times.
✓ Branch 5 taken 3 times.
|
15 | for(PVecFunction::iterator it(vecFunction.begin()); it != vecFunction.end(); ++it){ |
119 |
3/3✓ Branch 2 taken 12 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 3 times.
|
12 | if(!repr_isFunction(*it)){continue;} |
120 |
9/9✓ Branch 2 taken 3 times.
✓ Branch 5 taken 3 times.
✓ Branch 9 taken 3 times.
✓ Branch 12 taken 3 times.
✓ Branch 15 taken 3 times.
✓ Branch 18 taken 3 times.
✓ Branch 21 taken 3 times.
✓ Branch 24 taken 3 times.
✓ Branch 27 taken 3 times.
|
3 | body += "extern " + getHandleFunctionType(it->getName()) + " " + getHandleFunction(it->getName()) + ";\n"; |
121 | } | ||
122 |
1/1✓ Branch 1 taken 3 times.
|
3 | body += "\n\n"; |
123 |
2/2✓ Branch 3 taken 12 times.
✓ Branch 4 taken 3 times.
|
15 | for(PVecFunction::iterator it(vecFunction.begin()); it != vecFunction.end(); ++it){ |
124 |
2/2✓ Branch 2 taken 12 times.
✓ Branch 5 taken 12 times.
|
12 | body += cpp_backendTableHeaderInline(*it); |
125 | } | ||
126 |
5/5✓ Branch 1 taken 3 times.
✓ Branch 4 taken 3 times.
✓ Branch 7 taken 3 times.
✓ Branch 10 taken 3 times.
✓ Branch 13 taken 3 times.
|
3 | body += "void " + getUpdateFunction(source.getName()) + "(void * handle);\n\n"; |
127 | |||
128 |
1/1✓ Branch 1 taken 3 times.
|
3 | body += "#endif\n\n"; |
129 | 6 | return body; | |
130 | 3 | } | |
131 | |||
132 | ///Get the mangled name of the given function name | ||
133 | /** @param libraryName : file name of the library to be used | ||
134 | * @param functionName : name of the function to be searched | ||
135 | * @return mangled name of the corresponding function | ||
136 | */ | ||
137 | 3 | PString getMangleFunctionName(const PString & libraryName, const PString & functionName){ | |
138 |
1/4✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
3 | if(libraryName == ""){return functionName;} |
139 |
2/2✓ Branch 1 taken 3 times.
✓ Branch 4 taken 3 times.
|
3 | PPath outputTmpFile(".mangledFunctionName.txt"); |
140 |
6/6✓ Branch 1 taken 3 times.
✓ Branch 4 taken 3 times.
✓ Branch 7 taken 3 times.
✓ Branch 10 taken 3 times.
✓ Branch 13 taken 3 times.
✓ Branch 16 taken 3 times.
|
6 | PString command("objdump --syms "+libraryName+" | grep \".text\" | sed -e \"s/ /\\n/g\" | grep "+functionName+" | head -n 1 > "+outputTmpFile); |
141 |
2/3✓ Branch 2 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
|
3 | if(system(command.c_str()) != 0){ |
142 | ✗ | return functionName; | |
143 | } | ||
144 |
1/1✓ Branch 1 taken 3 times.
|
3 | PString fullFileContent(outputTmpFile.loadFileContent()); |
145 |
5/5✓ Branch 1 taken 3 times.
✓ Branch 4 taken 3 times.
✓ Branch 7 taken 3 times.
✓ Branch 10 taken 3 times.
✓ Branch 13 taken 3 times.
|
3 | std::cerr << "getMangleFunctionName : full file content mangle function '"<<functionName<<"' : " << fullFileContent << std::endl; |
146 |
2/2✓ Branch 1 taken 3 times.
✓ Branch 4 taken 3 times.
|
3 | PString mangleFunction(fullFileContent.eraseChar("\n\t ")); |
147 |
1/2✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
|
3 | if(remove(outputTmpFile.c_str()) != 0){ |
148 | ✗ | std::cerr << "DPS::LibraryHandle::mangleFunctionName : cannot remove file '"<<outputTmpFile<<"'" << std::endl; | |
149 | } | ||
150 |
1/1✓ Branch 1 taken 3 times.
|
3 | return mangleFunction; |
151 | 3 | } | |
152 | |||
153 | ///Save the source of the given PSource | ||
154 | /** @param source : PSource to be used | ||
155 | * @param libName : filename to a binary library | ||
156 | * @return corresponding string | ||
157 | */ | ||
158 | 3 | PString cpp_backendSource(PSource & source, const PString & libName){ | |
159 | 3 | PString body(cpp_licenceSaveStr()); | |
160 |
1/1✓ Branch 1 taken 3 times.
|
3 | body += "#include <stdio.h>\n"; |
161 |
1/1✓ Branch 1 taken 3 times.
|
3 | body += "#include <stdlib.h>\n"; |
162 |
1/1✓ Branch 1 taken 3 times.
|
3 | body += "#include <dlfcn.h>\n\n"; |
163 |
5/5✓ Branch 1 taken 3 times.
✓ Branch 4 taken 3 times.
✓ Branch 7 taken 3 times.
✓ Branch 10 taken 3 times.
✓ Branch 13 taken 3 times.
|
3 | body += "#include \""+source.getName().eraseExtension()+".h\"\n\n"; |
164 | |||
165 |
1/1✓ Branch 1 taken 3 times.
|
3 | PVecFunction & vecFunction = source.getVecFunction(); |
166 |
2/2✓ Branch 4 taken 12 times.
✓ Branch 5 taken 3 times.
|
15 | for(PVecFunction::iterator it(vecFunction.begin()); it != vecFunction.end(); ++it){ |
167 |
3/3✓ Branch 2 taken 12 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 3 times.
|
12 | if(!repr_isFunction(*it)){continue;} |
168 |
8/8✓ Branch 2 taken 3 times.
✓ Branch 5 taken 3 times.
✓ Branch 9 taken 3 times.
✓ Branch 12 taken 3 times.
✓ Branch 15 taken 3 times.
✓ Branch 18 taken 3 times.
✓ Branch 21 taken 3 times.
✓ Branch 24 taken 3 times.
|
3 | body += getHandleFunctionType(it->getName()) + " " + getHandleFunction(it->getName()) + ";\n"; |
169 | } | ||
170 |
1/1✓ Branch 1 taken 3 times.
|
3 | body += "\n\n"; |
171 |
1/1✓ Branch 1 taken 3 times.
|
3 | body += "///Update the all the function handles of the file\n"; |
172 |
1/1✓ Branch 1 taken 3 times.
|
3 | body += "/**\t@param handle : pointer to loaded library\n"; |
173 |
1/1✓ Branch 1 taken 3 times.
|
3 | body += "*/\n"; |
174 |
5/5✓ Branch 1 taken 3 times.
✓ Branch 4 taken 3 times.
✓ Branch 7 taken 3 times.
✓ Branch 10 taken 3 times.
✓ Branch 13 taken 3 times.
|
3 | body += "void " + getUpdateFunction(source.getName()) + "(void * handle){\n"; |
175 |
2/2✓ Branch 4 taken 12 times.
✓ Branch 5 taken 3 times.
|
15 | for(PVecFunction::iterator it(vecFunction.begin()); it != vecFunction.end(); ++it){ |
176 |
3/3✓ Branch 2 taken 12 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 3 times.
|
12 | if(!repr_isFunction(*it)){continue;} |
177 |
2/2✓ Branch 2 taken 3 times.
✓ Branch 5 taken 3 times.
|
3 | PString mangleFunction(getMangleFunctionName(libName, it->getName())); |
178 |
11/11✓ Branch 2 taken 3 times.
✓ Branch 5 taken 3 times.
✓ Branch 9 taken 3 times.
✓ Branch 12 taken 3 times.
✓ Branch 15 taken 3 times.
✓ Branch 18 taken 3 times.
✓ Branch 21 taken 3 times.
✓ Branch 24 taken 3 times.
✓ Branch 27 taken 3 times.
✓ Branch 30 taken 3 times.
✓ Branch 33 taken 3 times.
|
3 | body += "\t"+getHandleFunction(it->getName())+" = ("+getHandleFunctionType(it->getName())+")(dlsym(handle, \""+mangleFunction+"\"));\n"; |
179 | 3 | } | |
180 |
1/1✓ Branch 1 taken 3 times.
|
3 | body += "}\n\n"; |
181 | 3 | return body; | |
182 | } | ||
183 | |||
184 | ///Save a vector of PSource in the output directory | ||
185 | /** @param source : source to be saved | ||
186 | * @param libName : filename to a binary library | ||
187 | * @param outputDir : output directory where to save PSource | ||
188 | * @return true on success, false otherwise | ||
189 | */ | ||
190 | 3 | bool cpp_backend(PSource & source, const PString & libName, const PPath & outputDir){ | |
191 |
1/1✓ Branch 1 taken 3 times.
|
3 | PString headerSrc(cpp_backendHeader(source)); |
192 |
1/1✓ Branch 1 taken 3 times.
|
3 | PString sourceSrc(cpp_backendSource(source, libName)); |
193 |
3/3✓ Branch 1 taken 3 times.
✓ Branch 4 taken 3 times.
✓ Branch 7 taken 3 times.
|
3 | PPath baseFileName(source.getName().eraseExtension()); |
194 |
5/5✓ Branch 1 taken 3 times.
✓ Branch 4 taken 3 times.
✓ Branch 7 taken 3 times.
✓ Branch 10 taken 3 times.
✓ Branch 13 taken 3 times.
|
6 | PPath outputHeaderFile(outputDir / baseFileName + PString(".h")); |
195 |
5/5✓ Branch 1 taken 3 times.
✓ Branch 4 taken 3 times.
✓ Branch 7 taken 3 times.
✓ Branch 10 taken 3 times.
✓ Branch 13 taken 3 times.
|
6 | PPath outputSourceFile(outputDir / baseFileName + PString(".cpp")); |
196 |
2/3✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
|
3 | if(!outputHeaderFile.saveFileContent(headerSrc)){ |
197 | ✗ | std::cerr << "cpp_backend : cannot save header file '"<<outputHeaderFile<<"'" << std::endl; | |
198 | ✗ | return false; | |
199 | } | ||
200 |
4/4✓ Branch 1 taken 3 times.
✓ Branch 4 taken 3 times.
✓ Branch 7 taken 3 times.
✓ Branch 10 taken 3 times.
|
3 | std::cout << "cpp_backend : create header file '"<<outputHeaderFile<<"'" <<std::endl; |
201 |
2/3✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
|
3 | if(!outputSourceFile.saveFileContent(sourceSrc)){ |
202 | ✗ | std::cerr << "cpp_backend : cannot save source file '"<<outputSourceFile<<"'" << std::endl; | |
203 | ✗ | return false; | |
204 | } | ||
205 |
4/4✓ Branch 1 taken 3 times.
✓ Branch 4 taken 3 times.
✓ Branch 7 taken 3 times.
✓ Branch 10 taken 3 times.
|
3 | std::cout << "cpp_backend : create source file '"<<outputSourceFile<<"'" <<std::endl; |
206 | 3 | return true; | |
207 | 3 | } | |
208 | |||
209 | ///Save a vector of PSource in the output directory | ||
210 | /** @param vecSource : vector of source | ||
211 | * @param libName : filename to a binary library | ||
212 | * @param outputDir : output directory where to save PSource | ||
213 | * @return true on success, false otherwise | ||
214 | */ | ||
215 | 3 | bool cpp_backend(PVecSource & vecSource, const PString & libName, const PPath & outputDir){ | |
216 | 3 | bool b(true); | |
217 |
2/2✓ Branch 3 taken 3 times.
✓ Branch 4 taken 3 times.
|
6 | for(PVecSource::iterator it(vecSource.begin()); it != vecSource.end(); ++it){ |
218 |
1/1✓ Branch 2 taken 3 times.
|
3 | b &= cpp_backend(*it, libName, outputDir); |
219 | } | ||
220 | 3 | return b; | |
221 | } | ||
222 | |||
223 |