* Finishes support for Context, InsertionPoint and Location to be carried by the thread using context managers. * Introduces type casters and utilities so that DefaultPyMlirContext and DefaultPyLocation in method signatures does the right thing (allows explicit or gets from the thread context). * Extend the rules for the thread context stack to handle nesting, appropriately inheriting and clearing depending on whether the context is the same. * Refactors all method signatures to follow the new convention on trailing parameters for defaulting parameters (loc, ip, context). When the objects are carried in the thread context, this allows most explicit uses of these values to be elided. * Removes the style guide section on putting accessors to construct global objects on the PyMlirContext: this style fails to make good use of the new facility since it is often the only thing remaining needing an MlirContext. * Moves Module parse/creation from mlir.ir.Context to static methods on mlir.ir.Module. * Moves Context.create_operation to a static Operation.create method. * Moves Type parsing from mlir.ir.Context to static methods on mlir.ir.Type. * Moves Attribute parsing from mlir.ir.Context to static methods on mlir.ir.Attribute. * Move Location factory methods from mlir.ir.Context to static methods on mlir.ir.Location. * Refactors the std dialect fake "ODS" generated code to take advantage of the new scheme. Differential Revision: https://reviews.llvm.org/D90547
100 lines
2.5 KiB
Python
100 lines
2.5 KiB
Python
# RUN: %PYTHON %s | FileCheck %s
|
|
|
|
import gc
|
|
from mlir.ir import *
|
|
|
|
def run(f):
|
|
print("\nTEST:", f.__name__)
|
|
f()
|
|
gc.collect()
|
|
assert Context._get_live_count() == 0
|
|
|
|
|
|
# CHECK-LABEL: TEST: testContextEnterExit
|
|
def testContextEnterExit():
|
|
with Context() as ctx:
|
|
assert Context.current is ctx
|
|
try:
|
|
_ = Context.current
|
|
except ValueError as e:
|
|
# CHECK: No current Context
|
|
print(e)
|
|
else: assert False, "Expected exception"
|
|
|
|
run(testContextEnterExit)
|
|
|
|
|
|
# CHECK-LABEL: TEST: testLocationEnterExit
|
|
def testLocationEnterExit():
|
|
ctx1 = Context()
|
|
with Location.unknown(ctx1) as loc1:
|
|
assert Context.current is ctx1
|
|
assert Location.current is loc1
|
|
|
|
# Re-asserting the same context should not change the location.
|
|
with ctx1:
|
|
assert Context.current is ctx1
|
|
assert Location.current is loc1
|
|
# Asserting a different context should clear it.
|
|
with Context() as ctx2:
|
|
assert Context.current is ctx2
|
|
try:
|
|
_ = Location.current
|
|
except ValueError: pass
|
|
else: assert False, "Expected exception"
|
|
|
|
# And should restore.
|
|
assert Context.current is ctx1
|
|
assert Location.current is loc1
|
|
|
|
# All should clear.
|
|
try:
|
|
_ = Location.current
|
|
except ValueError as e:
|
|
# CHECK: No current Location
|
|
print(e)
|
|
else: assert False, "Expected exception"
|
|
|
|
run(testLocationEnterExit)
|
|
|
|
|
|
# CHECK-LABEL: TEST: testInsertionPointEnterExit
|
|
def testInsertionPointEnterExit():
|
|
ctx1 = Context()
|
|
m = Module.create(Location.unknown(ctx1))
|
|
ip = InsertionPoint.at_block_terminator(m.body)
|
|
|
|
with ip:
|
|
assert InsertionPoint.current is ip
|
|
# Asserting a location from the same context should preserve.
|
|
with Location.unknown(ctx1) as loc1:
|
|
assert InsertionPoint.current is ip
|
|
assert Location.current is loc1
|
|
# Location should clear.
|
|
try:
|
|
_ = Location.current
|
|
except ValueError: pass
|
|
else: assert False, "Expected exception"
|
|
|
|
# Asserting the same Context should preserve.
|
|
with ctx1:
|
|
assert InsertionPoint.current is ip
|
|
|
|
# Asserting a different context should clear it.
|
|
with Context() as ctx2:
|
|
assert Context.current is ctx2
|
|
try:
|
|
_ = InsertionPoint.current
|
|
except ValueError: pass
|
|
else: assert False, "Expected exception"
|
|
|
|
# All should clear.
|
|
try:
|
|
_ = InsertionPoint.current
|
|
except ValueError as e:
|
|
# CHECK: No current InsertionPoint
|
|
print(e)
|
|
else: assert False, "Expected exception"
|
|
|
|
run(testInsertionPointEnterExit)
|