package com.oracle.truffle.llvm.runtime.nodes.func;
import java.util.HashMap;
import java.util.Map;
import com.oracle.truffle.api.CompilerAsserts;
import com.oracle.truffle.api.frame.FrameDescriptor;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.source.Source;
import com.oracle.truffle.api.source.SourceSection;
import com.oracle.truffle.llvm.runtime.LLVMLanguage;
import com.oracle.truffle.llvm.runtime.datalayout.DataLayout;
import com.oracle.truffle.llvm.runtime.debug.scope.LLVMSourceLocation;
import com.oracle.truffle.llvm.runtime.memory.LLVMStack.LLVMStackAccess;
import com.oracle.truffle.llvm.runtime.nodes.api.LLVMExpressionNode;
import com.oracle.truffle.llvm.runtime.nodes.api.LLVMHasDatalayoutNode;
public final class LLVMFunctionStartNode extends LLVMRootNode implements LLVMHasDatalayoutNode {
@Child private LLVMExpressionNode node;
private final String name;
private final int explicitArgumentsCount;
private final String originalName;
private final Source bcSource;
private final LLVMSourceLocation sourceLocation;
private final DataLayout dataLayout;
public LLVMFunctionStartNode(LLVMLanguage language, LLVMStackAccess stackAccess, LLVMExpressionNode node, FrameDescriptor frameDescriptor, String name, int explicitArgumentsCount,
String originalName, Source bcSource,
LLVMSourceLocation location, DataLayout dataLayout) {
super(language, frameDescriptor, stackAccess);
this.dataLayout = dataLayout;
this.explicitArgumentsCount = explicitArgumentsCount;
this.node = node;
this.name = name;
this.originalName = originalName;
this.bcSource = bcSource;
this.sourceLocation = location;
}
@Override
public String toString() {
return name;
}
@Override
public SourceSection getSourceSection() {
return sourceLocation.getSourceSection();
}
@Override
public boolean isInternal() {
return bcSource.isInternal();
}
@Override
public Object execute(VirtualFrame frame) {
return node.executeGeneric(frame);
}
@Override
public String getName() {
if (originalName != null) {
return originalName;
}
return name;
}
public int getExplicitArgumentsCount() {
return explicitArgumentsCount;
}
public String getOriginalName() {
return originalName;
}
public String getBcName() {
return name;
}
public Source getBcSource() {
return bcSource;
}
@Override
public DataLayout getDatalayout() {
return dataLayout;
}
@Override
public Map<String, Object> getDebugProperties() {
CompilerAsserts.neverPartOfCompilation();
final HashMap<String, Object> properties = new HashMap<>();
if (originalName != null) {
properties.put("originalName", originalName);
}
if (bcSource != null) {
properties.put("bcSource", bcSource);
}
if (sourceLocation != null) {
properties.put("sourceLocation", sourceLocation);
}
return properties;
}
}