use of com.oracle.truffle.api.source.SourceSection in project sulong by graalvm.
the class DIScopeBuilder method buildSection.
private SourceSection buildSection(MDFile file, long startLine, long startCol) {
if (file == null) {
return null;
}
final Source source = asSource(file);
if (source == null) {
return null;
}
final int line = (int) startLine;
final int col = (int) startCol;
SourceSection section;
try {
if (line <= 0) {
// this happens e.g. for functions implicitly generated by llvm in section
// '.text.startup'
section = source.createSection(1);
} else if (col <= 0) {
// columns in llvm 3.2 metadata are usually always 0
section = source.createSection(line);
} else {
section = source.createSection(line, col, 0);
}
} catch (Throwable ignored) {
// if the source file has changed since it was last compiled the line and column
// information in the metadata might not be accurate anymore
section = null;
}
return section;
}
use of com.oracle.truffle.api.source.SourceSection in project sulong by graalvm.
the class DebugInfoFunctionProcessor method initSourceFunction.
private void initSourceFunction(FunctionDefinition function, Source bitcodeSource) {
final MDBaseNode debugInfo = getDebugInfo(function);
LLVMSourceLocation scope = null;
LLVMSourceFunctionType type = null;
if (debugInfo != null) {
scope = cache.buildLocation(debugInfo);
LLVMSourceType actualType = cache.parseType(debugInfo);
if (actualType instanceof LLVMSourceFunctionType) {
type = (LLVMSourceFunctionType) actualType;
}
}
if (scope == null) {
final String sourceText = String.format("%s:%s", bitcodeSource.getName(), function.getName());
final Source irSource = Source.newBuilder(sourceText).mimeType(DIScopeBuilder.getMimeType(null)).name(sourceText).build();
final SourceSection simpleSection = irSource.createSection(1);
scope = LLVMSourceLocation.createBitcodeFunction(function.getName(), simpleSection);
}
final SourceFunction sourceFunction = new SourceFunction(scope, type);
function.setSourceFunction(sourceFunction);
for (SourceVariable local : sourceFunction.getVariables()) {
local.processFragments();
}
}
use of com.oracle.truffle.api.source.SourceSection in project sulong by graalvm.
the class LLVMSourceScope method create.
@TruffleBoundary
public static Iterable<Scope> create(Node node, Frame frame, LLVMContext context) {
final LLVMSourceContext sourceContext = context.getSourceContext();
final RootNode rootNode = node.getRootNode();
LLVMNode llvmNode = findStatementNode(node);
if (rootNode == null || llvmNode == null) {
return Collections.singleton(new LLVMSourceScope(sourceContext, node).toScope(frame));
}
LLVMSourceLocation scope = llvmNode.getSourceLocation();
final SourceSection sourceSection = llvmNode.getSourceSection();
LLVMSourceScope baseScope = new LLVMSourceScope(sourceContext, new LinkedList<>(), rootNode);
LLVMSourceScope staticScope = null;
for (boolean isLocalScope = true; isLocalScope && scope != null; scope = scope.getParent()) {
final LLVMSourceScope next = toScope(scope, sourceContext, rootNode, sourceSection);
copySymbols(next, baseScope);
if (scope.getKind() == LLVMSourceLocation.Kind.FUNCTION) {
baseScope.setName(next.getName());
if (scope.getCompileUnit() != null) {
staticScope = toScope(scope.getCompileUnit(), sourceContext, null, sourceSection);
}
isLocalScope = false;
}
}
List<Scope> scopeList = new ArrayList<>();
scopeList.add(baseScope.toScope(frame));
for (; scope != null; scope = scope.getParent()) {
// e.g. lambdas are compiled to calls to a method in a locally defined class. We
// cannot access the locals of the enclosing function since they do not lie on the
// function's frame. They are still accessible from the calling function's frame, so
// we can simply ignore this scope here. Also, any variables actually used in the
// lambda would still be available as the members of the 'this' pointer.
final LLVMSourceScope next = toScope(scope, sourceContext, null, sourceSection);
switch(scope.getKind()) {
case NAMESPACE:
case FILE:
case BLOCK:
if (next.hasSymbols()) {
scopeList.add(next.toScope(frame));
}
break;
case COMPILEUNIT:
if (staticScope == null) {
staticScope = next;
} else {
copySymbols(next, staticScope);
}
break;
}
}
if (staticScope != null && staticScope.hasSymbols()) {
scopeList.add(staticScope.toScope(frame));
}
return Collections.unmodifiableList(scopeList);
}
Aggregations