mirror of
https://github.com/Eaglercraft-TeaVM-Fork/eagler-teavm.git
synced 2024-12-22 08:14:09 -08:00
wasm: when building tests, resolve absolute paths to source files in DWARF
This commit is contained in:
parent
5a0c418389
commit
b7cf7b593c
|
@ -43,6 +43,7 @@ import org.teavm.backend.wasm.binary.BinaryWriter;
|
||||||
import org.teavm.backend.wasm.debug.DebugInfoBuilder;
|
import org.teavm.backend.wasm.debug.DebugInfoBuilder;
|
||||||
import org.teavm.backend.wasm.generate.DwarfClassGenerator;
|
import org.teavm.backend.wasm.generate.DwarfClassGenerator;
|
||||||
import org.teavm.backend.wasm.generate.DwarfGenerator;
|
import org.teavm.backend.wasm.generate.DwarfGenerator;
|
||||||
|
import org.teavm.backend.wasm.generate.SourceFileResolver;
|
||||||
import org.teavm.backend.wasm.generate.WasmClassGenerator;
|
import org.teavm.backend.wasm.generate.WasmClassGenerator;
|
||||||
import org.teavm.backend.wasm.generate.WasmDependencyListener;
|
import org.teavm.backend.wasm.generate.WasmDependencyListener;
|
||||||
import org.teavm.backend.wasm.generate.WasmGenerationContext;
|
import org.teavm.backend.wasm.generate.WasmGenerationContext;
|
||||||
|
@ -209,6 +210,7 @@ public class WasmTarget implements TeaVMTarget, TeaVMWasmHost {
|
||||||
private boolean hasThreads;
|
private boolean hasThreads;
|
||||||
private WasmRuntimeType runtimeType = WasmRuntimeType.TEAVM;
|
private WasmRuntimeType runtimeType = WasmRuntimeType.TEAVM;
|
||||||
private ReportingWasmBinaryStatsCollector statsCollector;
|
private ReportingWasmBinaryStatsCollector statsCollector;
|
||||||
|
private SourceFileResolver sourceFileResolver;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setController(TeaVMTargetController controller) {
|
public void setController(TeaVMTargetController controller) {
|
||||||
|
@ -309,6 +311,10 @@ public class WasmTarget implements TeaVMTarget, TeaVMWasmHost {
|
||||||
this.runtimeType = runtimeType;
|
this.runtimeType = runtimeType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setSourceFileResolver(SourceFileResolver sourceFileResolver) {
|
||||||
|
this.sourceFileResolver = sourceFileResolver;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public WasmRuntimeType getRuntimeType() {
|
public WasmRuntimeType getRuntimeType() {
|
||||||
return runtimeType;
|
return runtimeType;
|
||||||
|
@ -476,7 +482,7 @@ public class WasmTarget implements TeaVMTarget, TeaVMWasmHost {
|
||||||
var names = new NameProviderWithSpecialNames(new WasmNameProvider(), controller.getUnprocessedClassSource());
|
var names = new NameProviderWithSpecialNames(new WasmNameProvider(), controller.getUnprocessedClassSource());
|
||||||
var metadataRequirements = new ClassMetadataRequirements(controller.getDependencyInfo());
|
var metadataRequirements = new ClassMetadataRequirements(controller.getDependencyInfo());
|
||||||
|
|
||||||
var dwarfGenerator = debugging ? new DwarfGenerator() : null;
|
var dwarfGenerator = debugging ? new DwarfGenerator(sourceFileResolver) : null;
|
||||||
if (dwarfGenerator != null) {
|
if (dwarfGenerator != null) {
|
||||||
dwarfGenerator.begin();
|
dwarfGenerator.begin();
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2023 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.teavm.backend.wasm.generate;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class DirectorySourceFileResolver implements SourceFileResolver {
|
||||||
|
private List<File> directories;
|
||||||
|
private Map<String, Wrapper> cache = new HashMap<>();
|
||||||
|
|
||||||
|
public DirectorySourceFileResolver(List<File> directories) {
|
||||||
|
this.directories = List.copyOf(directories);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String resolveFile(String file) {
|
||||||
|
return cache.computeIfAbsent(file, f -> {
|
||||||
|
for (var dir : directories) {
|
||||||
|
var candidate = new File(dir, f);
|
||||||
|
if (candidate.isFile()) {
|
||||||
|
return new Wrapper(candidate.getAbsolutePath());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new Wrapper(null);
|
||||||
|
}).value;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class Wrapper {
|
||||||
|
final String value;
|
||||||
|
|
||||||
|
Wrapper(String value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -42,9 +42,13 @@ public class DwarfGenerator {
|
||||||
private DwarfPlaceholder endOfSection;
|
private DwarfPlaceholder endOfSection;
|
||||||
public final DwarfStrings strings = new DwarfStrings();
|
public final DwarfStrings strings = new DwarfStrings();
|
||||||
private DwarfStrings lineStrings = new DwarfStrings();
|
private DwarfStrings lineStrings = new DwarfStrings();
|
||||||
private DwarfLinesGenerator lines = new DwarfLinesGenerator(lineStrings);
|
private DwarfLinesGenerator lines;
|
||||||
private Marker highPcMarker;
|
private Marker highPcMarker;
|
||||||
|
|
||||||
|
public DwarfGenerator(SourceFileResolver sourceFileResolver) {
|
||||||
|
lines = new DwarfLinesGenerator(lineStrings, sourceFileResolver);
|
||||||
|
}
|
||||||
|
|
||||||
public void begin() {
|
public void begin() {
|
||||||
endOfSection = infoWriter.placeholder(4);
|
endOfSection = infoWriter.placeholder(4);
|
||||||
lines.begin();
|
lines.begin();
|
||||||
|
|
|
@ -26,6 +26,8 @@ import static org.teavm.backend.wasm.dwarf.DwarfConstants.DW_LNS_COPY;
|
||||||
import static org.teavm.backend.wasm.dwarf.DwarfConstants.DW_LNS_SET_FILE;
|
import static org.teavm.backend.wasm.dwarf.DwarfConstants.DW_LNS_SET_FILE;
|
||||||
import com.carrotsearch.hppc.ObjectIntHashMap;
|
import com.carrotsearch.hppc.ObjectIntHashMap;
|
||||||
import com.carrotsearch.hppc.ObjectIntMap;
|
import com.carrotsearch.hppc.ObjectIntMap;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
import org.teavm.backend.wasm.blob.Blob;
|
import org.teavm.backend.wasm.blob.Blob;
|
||||||
import org.teavm.backend.wasm.blob.Marker;
|
import org.teavm.backend.wasm.blob.Marker;
|
||||||
|
|
||||||
|
@ -37,6 +39,7 @@ class DwarfLinesGenerator {
|
||||||
|
|
||||||
Blob blob = new Blob();
|
Blob blob = new Blob();
|
||||||
private DwarfStrings strings;
|
private DwarfStrings strings;
|
||||||
|
private SourceFileResolver sourceFileResolver;
|
||||||
private Blob instructionsBlob = new Blob();
|
private Blob instructionsBlob = new Blob();
|
||||||
private Marker unitLengthMarker;
|
private Marker unitLengthMarker;
|
||||||
private Marker headerLengthMarker;
|
private Marker headerLengthMarker;
|
||||||
|
@ -48,9 +51,11 @@ class DwarfLinesGenerator {
|
||||||
private int file = 1;
|
private int file = 1;
|
||||||
private int line = 1;
|
private int line = 1;
|
||||||
private boolean sequenceStarted;
|
private boolean sequenceStarted;
|
||||||
|
private Map<String, String> resolvedFileMap = new HashMap<>();
|
||||||
|
|
||||||
DwarfLinesGenerator(DwarfStrings strings) {
|
DwarfLinesGenerator(DwarfStrings strings, SourceFileResolver sourceFileResolver) {
|
||||||
this.strings = strings;
|
this.strings = strings;
|
||||||
|
this.sourceFileResolver = sourceFileResolver;
|
||||||
}
|
}
|
||||||
|
|
||||||
void begin() {
|
void begin() {
|
||||||
|
@ -138,6 +143,7 @@ class DwarfLinesGenerator {
|
||||||
}
|
}
|
||||||
|
|
||||||
private int fileRef(String path) {
|
private int fileRef(String path) {
|
||||||
|
path = resolvePath(path);
|
||||||
var ref = fileIndexes.getOrDefault(path, -1);
|
var ref = fileIndexes.getOrDefault(path, -1);
|
||||||
if (ref < 0) {
|
if (ref < 0) {
|
||||||
var nameIndex = path.lastIndexOf('/') + 1;
|
var nameIndex = path.lastIndexOf('/') + 1;
|
||||||
|
@ -154,6 +160,16 @@ class DwarfLinesGenerator {
|
||||||
return ref;
|
return ref;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String resolvePath(String path) {
|
||||||
|
if (sourceFileResolver == null) {
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
return resolvedFileMap.computeIfAbsent(path, p -> {
|
||||||
|
var result = sourceFileResolver.resolveFile(p);
|
||||||
|
return result != null ? result : p;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
private int dirRef(String path) {
|
private int dirRef(String path) {
|
||||||
var ref = dirIndexes.getOrDefault(path, -1);
|
var ref = dirIndexes.getOrDefault(path, -1);
|
||||||
if (ref < 0) {
|
if (ref < 0) {
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2023 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.teavm.backend.wasm.generate;
|
||||||
|
|
||||||
|
public interface SourceFileResolver {
|
||||||
|
String resolveFile(String file);
|
||||||
|
}
|
|
@ -61,5 +61,28 @@ tasks.test {
|
||||||
systemProperty("teavm.junit.c.compiler", providers.gradleProperty("teavm.tests.c.compiler")
|
systemProperty("teavm.junit.c.compiler", providers.gradleProperty("teavm.tests.c.compiler")
|
||||||
.orElse("compile-c-unix-fast.sh").get())
|
.orElse("compile-c-unix-fast.sh").get())
|
||||||
|
|
||||||
|
jvmArgumentProviders += object : CommandLineArgumentProvider {
|
||||||
|
override fun asArguments(): Iterable<String> {
|
||||||
|
val dependencies = configurations.testRuntimeClasspath.get()
|
||||||
|
.incoming.resolutionResult.allDependencies
|
||||||
|
.asSequence()
|
||||||
|
.filterIsInstance<ResolvedDependencyResult>()
|
||||||
|
.map { it.requested }
|
||||||
|
.filterIsInstance<ProjectComponentSelector>()
|
||||||
|
.map { project.rootProject.project(it.projectPath) }
|
||||||
|
val projects = dependencies + project
|
||||||
|
val dirs = projects.map { it.layout.projectDirectory }.flatMap {
|
||||||
|
sequenceOf(
|
||||||
|
it.dir("src/main/java"),
|
||||||
|
it.dir("src/test/java")
|
||||||
|
)
|
||||||
|
}
|
||||||
|
val result = dirs
|
||||||
|
.map { it.asFile.absolutePath }
|
||||||
|
.joinToString(File.pathSeparator)
|
||||||
|
return listOf("-Dteavm.junit.sourceDirs=$result")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
maxParallelForks = (Runtime.getRuntime().availableProcessors() / 2).coerceAtLeast(1)
|
maxParallelForks = (Runtime.getRuntime().availableProcessors() / 2).coerceAtLeast(1)
|
||||||
}
|
}
|
|
@ -39,6 +39,7 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.StringTokenizer;
|
||||||
import java.util.WeakHashMap;
|
import java.util.WeakHashMap;
|
||||||
import java.util.concurrent.CountDownLatch;
|
import java.util.concurrent.CountDownLatch;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
@ -61,6 +62,7 @@ import org.teavm.backend.c.generate.CNameProvider;
|
||||||
import org.teavm.backend.javascript.JavaScriptTarget;
|
import org.teavm.backend.javascript.JavaScriptTarget;
|
||||||
import org.teavm.backend.wasm.WasmRuntimeType;
|
import org.teavm.backend.wasm.WasmRuntimeType;
|
||||||
import org.teavm.backend.wasm.WasmTarget;
|
import org.teavm.backend.wasm.WasmTarget;
|
||||||
|
import org.teavm.backend.wasm.generate.DirectorySourceFileResolver;
|
||||||
import org.teavm.callgraph.CallGraph;
|
import org.teavm.callgraph.CallGraph;
|
||||||
import org.teavm.debugging.information.DebugInformation;
|
import org.teavm.debugging.information.DebugInformation;
|
||||||
import org.teavm.debugging.information.DebugInformationBuilder;
|
import org.teavm.debugging.information.DebugInformationBuilder;
|
||||||
|
@ -117,6 +119,7 @@ public class TeaVMTestRunner extends Runner implements Filterable {
|
||||||
private static final String MINIFIED = "teavm.junit.minified";
|
private static final String MINIFIED = "teavm.junit.minified";
|
||||||
private static final String OPTIMIZED = "teavm.junit.optimized";
|
private static final String OPTIMIZED = "teavm.junit.optimized";
|
||||||
private static final String FAST_ANALYSIS = "teavm.junit.fastAnalysis";
|
private static final String FAST_ANALYSIS = "teavm.junit.fastAnalysis";
|
||||||
|
private static final String SOURCE_DIRS = "teavm.junit.sourceDirs";
|
||||||
|
|
||||||
private Class<?> testClass;
|
private Class<?> testClass;
|
||||||
private boolean isWholeClassCompilation;
|
private boolean isWholeClassCompilation;
|
||||||
|
@ -1125,6 +1128,20 @@ public class TeaVMTestRunner extends Runner implements Filterable {
|
||||||
Supplier<WasmTarget> targetSupplier = () -> {
|
Supplier<WasmTarget> targetSupplier = () -> {
|
||||||
WasmTarget target = new WasmTarget();
|
WasmTarget target = new WasmTarget();
|
||||||
target.setRuntimeType(runtimeType);
|
target.setRuntimeType(runtimeType);
|
||||||
|
var sourceDirs = System.getProperty(SOURCE_DIRS);
|
||||||
|
if (sourceDirs != null) {
|
||||||
|
var dirs = new ArrayList<File>();
|
||||||
|
for (var tokenizer = new StringTokenizer(sourceDirs, Character.toString(File.pathSeparatorChar));
|
||||||
|
tokenizer.hasMoreTokens();) {
|
||||||
|
var dir = new File(tokenizer.nextToken());
|
||||||
|
if (dir.isDirectory()) {
|
||||||
|
dirs.add(dir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!dirs.isEmpty()) {
|
||||||
|
target.setSourceFileResolver(new DirectorySourceFileResolver(dirs));
|
||||||
|
}
|
||||||
|
}
|
||||||
return target;
|
return target;
|
||||||
};
|
};
|
||||||
return compile(configuration, targetSupplier, TestNativeEntryPoint.class.getName(), path,
|
return compile(configuration, targetSupplier, TestNativeEntryPoint.class.getName(), path,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user