Skip to content

Commit a95cdee

Browse files
committed
cache so ABI in PythonContext
1 parent cd1579a commit a95cdee

File tree

3 files changed

+39
-36
lines changed

3 files changed

+39
-36
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ImpModuleBuiltins.java

Lines changed: 4 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@
5757
import com.oracle.graal.python.builtins.PythonBuiltins;
5858
import com.oracle.graal.python.builtins.modules.PythonCextBuiltinsFactory.DefaultCheckFunctionResultNodeGen;
5959
import com.oracle.graal.python.builtins.objects.PNone;
60-
import com.oracle.graal.python.builtins.objects.PythonAbstractObjectFactory.PInteropGetAttributeNodeGen;
6160
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
6261
import com.oracle.graal.python.builtins.objects.bytes.PBytesLike;
6362
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodesFactory.AsPythonObjectNodeGen;
@@ -117,10 +116,8 @@
117116
import com.oracle.truffle.api.interop.UnsupportedMessageException;
118117
import com.oracle.truffle.api.interop.UnsupportedTypeException;
119118
import com.oracle.truffle.api.library.CachedLibrary;
120-
import com.oracle.truffle.api.nodes.LanguageInfo;
121119
import com.oracle.truffle.api.source.Source;
122120
import com.oracle.truffle.api.source.Source.SourceBuilder;
123-
import com.oracle.truffle.llvm.api.Toolchain;
124121

125122
@CoreFunctions(defineModule = "_imp")
126123
public class ImpModuleBuiltins extends PythonBuiltins {
@@ -341,7 +338,7 @@ private Object loadDynamicModuleWithSpec(String name, String path, InteropLibrar
341338
String basename = name.substring(name.lastIndexOf('.') + 1);
342339
TruffleObject sulongLibrary;
343340
try {
344-
String extSuffix = ExtensionSuffixesNode.getSoAbi(context);
341+
String extSuffix = context.getSoAbi();
345342
CallTarget callTarget = env.parseInternal(Source.newBuilder(LLVM_LANGUAGE, context.getPublicTruffleFileRelaxed(path, extSuffix)).build());
346343
sulongLibrary = (TruffleObject) callTarget.call();
347344
} catch (SecurityException e) {
@@ -443,7 +440,7 @@ private void ensureCapiWasLoaded(String name, String path) throws IOException, I
443440
Env env = context.getEnv();
444441
CompilerDirectives.transferToInterpreterAndInvalidate();
445442

446-
String libPythonName = "libpython" + ExtensionSuffixesNode.getSoAbi(context);
443+
String libPythonName = "libpython" + context.getSoAbi();
447444
TruffleFile homePath = env.getInternalTruffleFile(context.getCAPIHome());
448445
TruffleFile capiFile = homePath.resolve(libPythonName);
449446
Object capi;
@@ -481,7 +478,7 @@ private GraalHPyContext ensureHPyWasLoaded(PythonContext context, String name, S
481478
Env env = context.getEnv();
482479
CompilerDirectives.transferToInterpreterAndInvalidate();
483480

484-
String libPythonName = "libhpy" + ExtensionSuffixesNode.getSoAbi(context);
481+
String libPythonName = "libhpy" + context.getSoAbi();
485482
TruffleFile homePath = env.getInternalTruffleFile(context.getCAPIHome());
486483
TruffleFile capiFile = homePath.resolve(libPythonName);
487484
try {
@@ -703,34 +700,7 @@ public abstract static class ExtensionSuffixesNode extends PythonBuiltinNode {
703700
@Specialization
704701
Object run(
705702
@CachedContext(PythonLanguage.class) PythonContext ctxt) {
706-
String soAbi = getSoAbi(ctxt);
707-
return factory().createList(new Object[]{soAbi, HPY_SUFFIX, ".so", ".dylib", ".su"});
708-
}
709-
710-
@TruffleBoundary
711-
public static String getSoAbi(PythonContext ctxt) {
712-
PythonModule sysModule = ctxt.getCore().lookupBuiltinModule("sys");
713-
Object implementationObj = ReadAttributeFromObjectNode.getUncached().execute(sysModule, "implementation");
714-
// sys.implementation.cache_tag
715-
String cacheTag = (String) PInteropGetAttributeNodeGen.getUncached().execute(implementationObj, "cache_tag");
716-
// sys.implementation._multiarch
717-
String multiArch = (String) PInteropGetAttributeNodeGen.getUncached().execute(implementationObj, "_multiarch");
718-
719-
Env env = ctxt.getEnv();
720-
LanguageInfo llvmInfo = env.getInternalLanguages().get(GraalPythonModuleBuiltins.LLVM_LANGUAGE);
721-
Toolchain toolchain = env.lookup(llvmInfo, Toolchain.class);
722-
String toolchainId = toolchain.getIdentifier();
723-
724-
// only use '.dylib' if we are on 'Darwin-native'
725-
String soExt;
726-
if ("darwin".equals(PythonUtils.getPythonOSName()) && "native".equals(toolchainId)) {
727-
soExt = ".dylib";
728-
} else {
729-
soExt = ".so";
730-
}
731-
732-
return "." + cacheTag + "-" + toolchainId + "-" + multiArch + soExt;
703+
return factory().createList(new Object[]{ctxt.getSoAbi(), HPY_SUFFIX, ".so", ".dylib", ".su"});
733704
}
734705
}
735-
736706
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/NativeLibrary.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444
import java.util.logging.Level;
4545

4646
import com.oracle.graal.python.PythonLanguage;
47-
import com.oracle.graal.python.builtins.modules.ImpModuleBuiltins;
4847
import com.oracle.graal.python.nodes.PNodeWithContext;
4948
import com.oracle.graal.python.runtime.NativeLibraryFactory.InvokeNativeFunctionNodeGen;
5049
import com.oracle.graal.python.runtime.exception.PythonControlFlowException;
@@ -241,7 +240,7 @@ private Object loadLibrary(PythonContext context) {
241240

242241
public static String getLibPath(PythonContext context, String name) {
243242
CompilerAsserts.neverPartOfCompilation();
244-
String libPythonName = name + ImpModuleBuiltins.ExtensionSuffixesNode.getSoAbi(context);
243+
String libPythonName = name + context.getSoAbi();
245244
TruffleFile homePath = context.getEnv().getInternalTruffleFile(context.getCAPIHome());
246245
TruffleFile file = homePath.resolve(libPythonName);
247246
return file.getPath();

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonContext.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,10 @@
5858

5959
import com.oracle.graal.python.PythonLanguage;
6060
import com.oracle.graal.python.builtins.Python3Core;
61+
import com.oracle.graal.python.builtins.modules.GraalPythonModuleBuiltins;
6162
import com.oracle.graal.python.builtins.objects.PNone;
6263
import com.oracle.graal.python.builtins.objects.PythonAbstractObject;
64+
import com.oracle.graal.python.builtins.objects.PythonAbstractObjectFactory.PInteropGetAttributeNodeGen;
6365
import com.oracle.graal.python.builtins.objects.cext.PythonNativeClass;
6466
import com.oracle.graal.python.builtins.objects.cext.capi.CApiContext;
6567
import com.oracle.graal.python.builtins.objects.cext.capi.PThreadState;
@@ -90,6 +92,7 @@
9092
import com.oracle.graal.python.runtime.exception.PythonThreadKillException;
9193
import com.oracle.graal.python.runtime.object.IDUtils;
9294
import com.oracle.graal.python.util.Consumer;
95+
import com.oracle.graal.python.util.PythonUtils;
9396
import com.oracle.graal.python.util.ShutdownHook;
9497
import com.oracle.graal.python.util.Supplier;
9598
import com.oracle.truffle.api.Assumption;
@@ -107,9 +110,11 @@
107110
import com.oracle.truffle.api.interop.ExceptionType;
108111
import com.oracle.truffle.api.interop.InteropLibrary;
109112
import com.oracle.truffle.api.interop.UnsupportedMessageException;
113+
import com.oracle.truffle.api.nodes.LanguageInfo;
110114
import com.oracle.truffle.api.profiles.ConditionProfile;
111115
import com.oracle.truffle.api.source.Source;
112116
import com.oracle.truffle.api.utilities.CyclicAssumption;
117+
import com.oracle.truffle.llvm.api.Toolchain;
113118

114119
public final class PythonContext {
115120
private static final Source IMPORT_WARNINGS_SOURCE = Source.newBuilder(PythonLanguage.ID, "import warnings\n", "<internal>").internal(true).build();
@@ -287,6 +292,8 @@ private static final class AtExitHook {
287292
@CompilationFinal private CApiContext cApiContext;
288293
@CompilationFinal private GraalHPyContext hPyContext;
289294

295+
private String soABI; // cache for soAPI
296+
290297
private static final Assumption singleNativeContext = Truffle.getRuntime().createAssumption("single native context assumption");
291298

292299
private final ReentrantLock globalInterpreterLock = new ReentrantLock();
@@ -1321,4 +1328,31 @@ public String getCodeFilename(CallTarget callTarget) {
13211328
public long getDeserializationId(String fileName) {
13221329
return deserializationId.computeIfAbsent(fileName, f -> new AtomicLong()).incrementAndGet();
13231330
}
1331+
1332+
@TruffleBoundary
1333+
public String getSoAbi() {
1334+
if (soABI == null) {
1335+
PythonModule sysModule = getCore().lookupBuiltinModule("sys");
1336+
Object implementationObj = ReadAttributeFromObjectNode.getUncached().execute(sysModule, "implementation");
1337+
// sys.implementation.cache_tag
1338+
String cacheTag = (String) PInteropGetAttributeNodeGen.getUncached().execute(implementationObj, "cache_tag");
1339+
// sys.implementation._multiarch
1340+
String multiArch = (String) PInteropGetAttributeNodeGen.getUncached().execute(implementationObj, "_multiarch");
1341+
1342+
LanguageInfo llvmInfo = env.getInternalLanguages().get(GraalPythonModuleBuiltins.LLVM_LANGUAGE);
1343+
Toolchain toolchain = env.lookup(llvmInfo, Toolchain.class);
1344+
String toolchainId = toolchain.getIdentifier();
1345+
1346+
// only use '.dylib' if we are on 'Darwin-native'
1347+
String soExt;
1348+
if ("darwin".equals(PythonUtils.getPythonOSName()) && "native".equals(toolchainId)) {
1349+
soExt = ".dylib";
1350+
} else {
1351+
soExt = ".so";
1352+
}
1353+
1354+
soABI = "." + cacheTag + "-" + toolchainId + "-" + multiArch + soExt;
1355+
}
1356+
return soABI;
1357+
}
13241358
}

0 commit comments

Comments
 (0)