Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 0 additions & 5 deletions ClangAstParser/src/pt/up/fe/specs/clang/ClangAstKeys.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
import org.suikasoft.jOptions.Datakey.DataKey;
import org.suikasoft.jOptions.Datakey.KeyFactory;
import org.suikasoft.jOptions.Interfaces.DataStore;
import pt.up.fe.specs.clang.ClangAstWebResource.LocalBuild;
import pt.up.fe.specs.clava.ClavaLog;
import pt.up.fe.specs.clava.ClavaOptions;
import pt.up.fe.specs.clava.language.Standard;
Expand Down Expand Up @@ -99,10 +98,6 @@ static DataStore toDataStore(List<String> flags) {

config.add(ClavaOptions.FLAGS_LIST, parsedFlags);

if (ClangAstWebResource.getDumperSource() instanceof LocalBuild) {
config.set(ClangAstKeys.LIBC_CXX_MODE, LibcMode.SYSTEM);
}

return config;
}

Expand Down
10 changes: 9 additions & 1 deletion ClangAstParser/src/pt/up/fe/specs/clang/ClangFiles.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,15 @@

import java.io.File;
import java.util.List;
import java.util.Objects;

public record ClangFiles(File clangExecutable, List<String> builtinIncludes, File systemResourceDir) {
public record ClangFiles(File clangExecutable, List<String> builtinIncludes, File systemResourceDir,
LibcMode libcMode) {

public ClangFiles {
Objects.requireNonNull(libcMode, "libcMode");
if (libcMode == LibcMode.AUTO) {
throw new IllegalArgumentException("Clang files must use a concrete libc mode");
}
}
}
43 changes: 30 additions & 13 deletions ClangAstParser/src/pt/up/fe/specs/clang/ClangResources.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;

Expand Down Expand Up @@ -64,22 +65,26 @@ public File getBuiltinCudaLib() {
return CudaResources.getBuiltinCudaLib(options.get(CodeParser.DUMPER_FOLDER).toPath());
}

public ClangFiles getClangFiles(LibcMode libcMode) {
public ClangFiles getClangFiles(LibcMode requestedLibcMode) {

var source = ClangAstWebResource.getDumperSource();
var useBuiltinCuda = options.get(CodeParser.CUDA_PATH).equalsIgnoreCase(CodeParser.getBuiltinOption());
var forceSystemLibc = source instanceof LocalBuild || ClangAstDumper.usePlugin();

if (source instanceof LocalBuild localBuild) {
var clangExecutable = getLocalExecutable(localBuild.folder());
var libcMode = resolveLibcMode(clangExecutable, requestedLibcMode, forceSystemLibc);
var systemResourceDir = libcMode == LibcMode.SYSTEM && useBuiltinCuda
? findSystemClangResourceDir(null)
: null;
return new ClangFiles(clangExecutable, List.of(), systemResourceDir);
return new ClangFiles(clangExecutable, List.of(), systemResourceDir, libcMode);
}

var resourceFolder = getClangResourceFolder();
var key = libcMode.name() + "_" + useBuiltinCuda + "_" + source + "_"
+ resourceFolder.getAbsolutePath();
var manifest = ClangAstWebResource.getManifest(resourceFolder);
File clangExecutable = prepareResources(manifest, resourceFolder);
var libcMode = resolveLibcMode(clangExecutable, requestedLibcMode, forceSystemLibc);
var key = libcMode.name() + "_" + useBuiltinCuda + "_" + source + "_" + resourceFolder.getAbsolutePath();
var cached = CLANG_FILES_CACHE.get(key);
if (isUsable(cached)) {
SpecsLogs.debug(() -> "Using cached version of Clang files: " + cached.files());
Expand All @@ -90,9 +95,7 @@ public ClangFiles getClangFiles(LibcMode libcMode) {
CLANG_FILES_CACHE.remove(key, cached);
}

var manifest = ClangAstWebResource.getManifest(resourceFolder);
File clangExecutable = prepareResources(manifest, resourceFolder);
var includes = prepareIncludes(manifest, clangExecutable, libcMode);
var includes = prepareIncludes(manifest, libcMode);
var systemResourceDir = libcMode == LibcMode.SYSTEM && useBuiltinCuda
? prepareSystemClangResourceDir(manifest)
: null;
Expand All @@ -104,7 +107,8 @@ public ClangFiles getClangFiles(LibcMode libcMode) {
touchUse(resourceFolder, includes.extractedFolder());
updateLastUsedAndCleanupStaleVersions(resourceFolder, includes.extractedFolder());

var newFiles = new CachedClangFiles(new ClangFiles(clangExecutable, includes.folders(), systemResourceDir),
var newFiles = new CachedClangFiles(new ClangFiles(clangExecutable, includes.folders(), systemResourceDir,
libcMode),
includes.extractedFolder());
var existingFiles = CLANG_FILES_CACHE.putIfAbsent(key, newFiles);
var selectedFiles = existingFiles == null ? newFiles : existingFiles;
Expand All @@ -113,6 +117,22 @@ public ClangFiles getClangFiles(LibcMode libcMode) {
return selectedFiles.files();
}

static LibcMode resolveLibcMode(File clangExecutable, LibcMode requestedLibcMode, boolean forceSystem) {
Objects.requireNonNull(clangExecutable, "clangExecutable");
Objects.requireNonNull(requestedLibcMode, "requestedLibcMode");

if (forceSystem) {
return LibcMode.SYSTEM;
}

return switch (requestedLibcMode) {
case AUTO -> useBuiltinLibc(clangExecutable, requestedLibcMode)
? LibcMode.BUILTIN_AND_LIBC
: LibcMode.SYSTEM;
case BUILTIN_AND_LIBC, SYSTEM -> requestedLibcMode;
};
}

private boolean isUsable(CachedClangFiles cached) {
if (cached == null) {
return false;
Expand Down Expand Up @@ -301,11 +321,8 @@ private static ProcessOutputAsString runClangAstDumper(File clangExecutable, Fil
return SpecsSystem.runProcess(arguments, true, false);
}

private PreparedIncludes prepareIncludes(ClangDumperManifest manifest, File clangExecutable,
LibcMode libcMode) {
var useBuiltinLibc = useBuiltinLibc(clangExecutable, libcMode);

if (!useBuiltinLibc) {
private PreparedIncludes prepareIncludes(ClangDumperManifest manifest, LibcMode libcMode) {
if (libcMode == LibcMode.SYSTEM) {
return new PreparedIncludes(List.of(), null);
}

Expand Down
Loading
Loading