summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2020-06-24Fixes.Yong He
2020-06-24Dynamic dispatch for generic interface requirements.Yong He
-Lower interfaces into actual `IRInterfaceType` insts. -Lower `DeclRef<AssocTypeDecl>` into `IRAssociatedType` -Generate proper IRType for generic functions. -Add a test case exercising dynamic dispatching a generic static function through an associated type. -Bug fixes for the test case.
2020-06-24Heterogeneous example (#1399)Dietrich Geisler
* Introduced heterogeneous example. Example includes C++ source and header files, and does not currently make use of the associated slang file when building. The intent of this commit is to introduce the example as a baseline for later updates as the heterogeneous model is expanded. * Changing namespace * Renamed and rewrote README * Updated example to account for compiler updates * Updated path Co-authored-by: Tim Foley <tfoleyNV@users.noreply.github.com>
2020-06-24AST Serialization writing (#1407)jsmall-nvidia
* Try to fix problem with C++ extractor concating tokens producing an erroneous result. * Improve naming/comments around C++ extractor fix. * Another small improvement around space concating when outputing token list. * Handle some more special cases for consecutive tokens for C++ extractor concat of tokens. * WIP AST serialization. * Comment out so compile works. * More work on AST serialization. * WIP AST serialize. * WIP AST Serialization - handling more types. * WIP: Compiles but not all types are converted, as not all List element types are handled. * Compiles with array types. * Finish off AST serialization of remaining types. * Remove ComputedLayoutModifier and TupleVarModifier. * Add fields to ASTSerialClass type. * Construct AST type layout. * AST Serialization working for writing to ASTSerialWriter. * Removed call to ASTSerialization::selfTest in session creation. * Fixes for gcc. * Diagnostics handling - better handling of dashify. * Improve comment around DiagnosticLookup. * Updated VS project.
2020-06-19Merge pull request #1403 from tfoleyNV/struct-inheritance-and-interfacesYong He
Work on struct inheritance and interfaces
2020-06-19fixup: review feedbackTim Foley
2020-06-19Merge remote-tracking branch 'origin/master' into ↵Tim Foley
struct-inheritance-and-interfaces
2020-06-19Dynamic dispatch for static member functions of associatedtypes. (#1404)Yong He
2020-06-19fixup: actually make the test case test somethingTim Foley
2020-06-18Merge pull request #1401 from jsmall-nvidia/feature/prelude-fixYong He
Prelude fix/disable memaccess warning on gcc
2020-06-18Work on struct inheritance and interfacesTim Foley
The main new feature that works here is that a derived `struct` type can satisfy one or more interface requirements using methods it inherited from a base `struct` type: ```hlsl interface ICounter { [mutating] void increment(); } struct CounterBase { int val; [mutating] void increment() { val++; } } struct ResetableCounter : CounterBase, ICounter { [mutating] void reset() { val = 0; } } ``` Here the derived `ResetableCounter` type is satisfying the `increment()` requirement from `ICounter` using the inherited `CounterBase` method instead of one defined on `ResetableCounter`. The crux of the problem here was that after lowering to HLSL/GLSL, the above code looks something like: ```hlsl struct CounterBase { int val; }; void CounterBase_increment(in out CounterBase this) { this.val++; } struct ResetableCounter { CounterBase base; } void ResetableCounter_reset(in out ResetableCounter this) { this.base.val = 0; } ``` The central problem is that `CounterBase_increment` here is not type-compatible what we expect to find in the witness table for `ResetableCounter : ICounter`: the `this` parameter has the wrong type! The basic solution strategy here is to intercept the search for a witness to sastify an interface requirement in `findWitnessForInterfaceRequirement` (those witnesses get collected into a witness table). The revised logic first looks for an exact match, which will only consider members introduced for the type itself, and not those introduced by base types. If an exact match for a method requirement is not found, the semantic checker then tries to *synthesize* a witness for the requirement, which more or less amounts to generating a function like: ```hlsl [mutating] void ResetableCounter::synthesized_increment() { this.increment(); } ``` The body of that synthesized method will type-check just fine in this case (because it desugars into `this.base.increment()`, more or less), and thus the synthesized method declaration can be used as the actual witness that drives downstream code generation. Details: * I added some options to lookup to allow us to explicitly skip member lookup through base interfaces; this should make sure that we don't accidentally satisfy an interface requirement using a member of the same or another interface (since such members are conceptually `abstract`). * As it originally stood, the semantic checker was allowing `CounterBase.increment()` to satisfy the `increment()` requirement of `ResetableCounter` directly, with the result that we got invalid HLSL/GLSL code as output. In order to avoid this and other bad cases, I made sure that the "exact match" case of requirement satisfaction ignores members that included any "breadcrumbs" in the lookup result item (since the breadcrumbs would all indicate transformations that needed to be applied to `this` to find the right member). * If we eventually have targets where `this` is passed by pointer/reference in all cases, then all of this work is not needed for the common case of single inheritance, and the base-type method should be usable as a witness directly. I don't see any easy way to handle that special case without producing target-dependent code in the front-end. It might be that we need an IR pass that can detect functions that are trivial "forwarding" functions and replace them with the function they forward to. * This change includes a test case that should have come along with the original PR that started adding struct inheritance Caveats: * The comments in this change talk about things like allowing a method with a default parameter to satisfy a requirement without that parameter. That scenario won't actually work at present because we still have an enormous hack in our logic for checking methods against requirements: we don't actually consider their signatures! I couldn't fold a fix for that issue into this change because there are subtle corner cases around associated types that we need to handle correctly (which were part of the reason why the checking is as hacked as it is) * This change does *not* try to test or address the case where we want to have a `Derived` type conform to `ISomething` because it inherits from `Base` and `Base : ISomething`. That case has its own details that need to be worked out, but ideally can follow a similar implementation strategy when it comes to re-using methods from `Base` to satisfy requirement on `Derived`.
2020-06-18Merge branch 'master' into feature/prelude-fixYong He
2020-06-18Merge pull request #1400 from csyonghe/dyndispatchYong He
Dynamic dispatch non-static functions.
2020-06-18Merge branch 'master' into dyndispatchTim Foley
2020-06-18Prelude is associated with SourceLanguage (#1398)jsmall-nvidia
* Associate a downstream compiler for prelude lookup even if output is source. * Remove LanguageStyle and just use SourceLanguage instread. * Added set/getPrelude. Made prelude work on source language. * Fix typo in method name replacement. get/SetPrelude get/setLanguagePrelude * Fix issue because of method name change. * Remove getPreludeDownstreamCompilerForTarget
2020-06-18Try using cmath or math.h depending on compiler to avoid issues around isinf ↵jsmall-nvidia
etc.
2020-06-18Fix and improvements around repro (#1397)jsmall-nvidia
* * Fix output in slang repro command line * Profile uses lowerCamel method names (had mix of upper and lower) * Rename slang-serialize-state/SerializeStateUtil to slang-repro and ReproUtil.
2020-06-18#include <cmath>jsmall-nvidia
Use SLANG_PRELUDE_STD macro to prefix functions that may need to be specified in std:: namespace.
2020-06-18Improvements around C++ code generation (#1396)jsmall-nvidia
* * Remove UniformState and UniformEntryPointParams types * Put all output C++ source in an anonymous namespace * If SLANG_PRELUDE_NAMESPACE is set, make what it defines available in generated file. * Fix signature issue in performance-profile.slang * Context -> KernelContext to avoid ambiguity. * Fix issues around dynamic dispatch and anonymous namespace. * Fix typo.
2020-06-18* Fix warnings from preludejsmall-nvidia
* Make compilation work on gcc by disabling -Wclass-mem-access
2020-06-18Associate a downstream compiler for prelude lookup even if output is source. ↵jsmall-nvidia
(#1395) Co-authored-by: Tim Foley <tfoleyNV@users.noreply.github.com>
2020-06-17Dynamic dipatch non-static functions.Yong He
2020-06-17Add != operator for enum types (#1394)Tim Foley
This was an oversight in the stdlib, and the `!=` definition follows the `==` in a straightforward fashion.
2020-06-17Generate dynamic C++ code for the minimal test case. (#1391)Yong He
* Add IR pass to lower generics into ordinary functions. * Fix project files * Emit dynamic C++ code for simple generics and witness tables. Fixes #1386. * Remove -dump-ir flag. * Fixups.
2020-06-17Hotfix/slangc unreleased compile request (#1393)jsmall-nvidia
* Releases compile request if there is an error. * Arrange so that caller can clean up CompileRequest so don't have to capture all paths.
2020-06-16Merge pull request #1392 from tfoleyNV/premake-batYong He
Add a batch file for invoke premake
2020-06-16Add a batch file for invoke premakeTim Foley
This change adds `./premake.bat` to the repository, which users in Windows (64-bit) can use to conveniently invoke the copy of premake that is pulled via the `slang-binaries` submodule. It should be possible to pass whatever options you passed to `premake5.exe` through to `premake.bat`. E.g., if you invoke: ``` .\premake.bat vs2015 ``` then you should get the desired results for the project/solution files we want to check in.
2020-06-15Merge pull request #1390 from csyonghe/glsl-loopYong He
Emit [[dont_unroll]] GLSL attribute for [loop] attribute.
2020-06-15Merge branch 'master' into glsl-loopTim Foley
2020-06-15Specialize function calls involving array arguments. (#1389)Yong He
Fixes #890. Co-authored-by: Tim Foley <tfoleyNV@users.noreply.github.com>
2020-06-15Remove implicit conversions to `void` (#1388)Tim Foley
* Remove implicit conversions to `void` Fixes #1372 The standard library code had accidentally introduced implicit-conversion `__init` operations on the `void` type that accepted each of the other basic types, so that a function written like: ```hlsl void bad() { return 1; } ``` would translate to: ```hlsl void bad() { return (void)1; } ``` The dual problesm are that the input code should have produced a diagnostic of some kind, and the output code doesn't appear to compile correctly through fxc. This change introduces several fixes aimed at this issue: * First, the problem in the stdlib code is plugged: we don't introduce implicit conversion operations *to* or *from* `void` (we'd only been banning it in one direction before) * Next, an explicit `__init` was added to `void` that accepts *any* type so that existing HLSL code that might do `(void) someExpression` to ignore a result will continue to work. This is a compatibility feature, and it might be argued that we should at least warn when it is used. Note that this function is expected to never appear in output HLSL/GLSL because its result will never be used, and it is marked `[__readNone]` allowing calls to it to be eliminated as dead code. * During IR lowering, we now take care to only emit the `IRReturnVal` instruction type if there is a non-`void` value being returned, and use `IRReturnVoid` for both the case where no expression was used in the `return` statement *and* the case where an expression of type `void` is returned. * A test case was added to confirm that returning `1` from a `void` function isn't allowed, while returning `(void) 1` *is*. The net result of these changes is that we now produce an error for the bad input code, we allow explicit casts to `void` as a compatibility feature, and we are more robust about treating `void` as if it is an ordinary type in the front-end. * fixup: missing file
2020-06-15Merge branch 'master' into glsl-loopYong He
2020-06-15Generate IRType for interfaces, and reference them as `operand[0]` in ↵Yong He
IRWitnessTable values (#1387) * Generate IRType for interfaces, and use them as the type of IRWitnessTable values. This results the following IR for the included test case: ``` [export("_S3tu010IInterface7Computep1pii")] let %1 : _ = key [export("_ST3tu010IInterface")] [nameHint("IInterface")] interface %IInterface : _(%1); [export("_S3tu04Impl7Computep1pii")] [nameHint("Impl.Compute")] func %Implx5FCompute : Func(Int, Int) { block %2( [nameHint("inVal")] param %inVal : Int): let %3 : Int = mul(%inVal, %inVal) return_val(%3) } [export("_SW3tu04Impl3tu010IInterface")] witness_table %4 : %IInterface { witness_table_entry(%1,%Implx5FCompute) } ``` * Fixes per code review comments. Moved interface type reference in IRWitnessTable from their type to operand[0]. * Fix typo in comment.
2020-06-13Emit [[dont_unroll]] attribute in GLSLYong He
2020-06-12Diagnose circularly-defined constants (#1384)Tim Foley
* Diagnose circularly-defined constants Work on #1374 This change diagnoses cases like the following: ```hlsl static const int kCircular = kCircular; static const int kInfinite = kInfinite + 1; static const int kHere = kThere; static const int kThere = kHere; ``` By diagnosing these as errors in the front-end we protect against infinite recursion leading to stack overflow crashes. The basic approach is to have front-end constant folding track variables that are in use when folding a sub-expression, and then diagnosing an error if the same variable is encountered again while it is in use. In order to make sure the error occurs whether or not the constant is referenced, we invoke constant folding on all `static const` integer variables. Limitations: * This only works for integers, since that is all front-end constant folding applies to. A future change can/should catch circularity in constants at the IR level (and handle more types). * This only works for constants. Circular references in the definition of a global variable are harder to diagnose, but at least shouldn't result in compiler crashes. * This doesn't work across modules, or through generic specialization: anything that requires global knowledge won't be checked * fixup: missing files * fixup: review feedback
2020-06-11Merge pull request #1383 from csyonghe/dyndispatchYong He
Add compiler flag to disable specialization pass.
2020-06-11Merge branch 'master' into dyndispatchYong He
2020-06-11Fix problem with C++ extractor ernoneous concating of type tokens (#1382)jsmall-nvidia
* Try to fix problem with C++ extractor concating tokens producing an erroneous result. * Improve naming/comments around C++ extractor fix. * Another small improvement around space concating when outputing token list. * Handle some more special cases for consecutive tokens for C++ extractor concat of tokens.
2020-06-10Add compiler flag to disable specialization pass.Yong He
2020-06-09Merge pull request #1381 from csyonghe/masterYong He
Generate .tar.gz file in linux release
2020-06-08Generate .tar.gz file in linux releaseYong He
2020-06-08Small fixes/improvements based on review. (#1379)jsmall-nvidia
2020-06-08Merge pull request #1378 from csyonghe/fixYong He
Filter lookup results from interfaces in `visitMemberExpr`.
2020-06-05Filter lookup results from interfaces in `visitMemberExpr`.Yong He
Fixes #1377
2020-06-05Merge pull request #1375 from csyonghe/findtypebynamefixYong He
Fix FindTypeByName reflection API not finding stdlib types.
2020-06-05Merge branch 'master' into findtypebynamefixYong He
2020-06-05ASTNodes use MemoryArena (#1376)jsmall-nvidia
* Add a ASTBuilder to a Module Only construct on valid ASTBuilder (was being called on nullptr on occassion) * Add nodes to ASTBuilder. * Compiles with RefPtr removed from AST node types. * Initialize all AST node pointer variables in headers to nullptr; * Initialize AST node variables as nullptr. Make ASTBuilder keep a ref on node types. Make SyntaxParseCallback returns a NodeBase * Don't release canonicalType on dtor (managed by ASTBuilder). * Give ASTBuilders a name and id, to help in debugging. For now destroy the session TypeCache, to stop it holding things released when the compile request destroys ASTBuilders. * Moved the TypeCheckingCache over to Linkage from Session. * NodeBase no longer derived from RefObject. * Only add/dtor nodes that need destruction. First pass compile on linux.
2020-06-05Merge branch 'master' into findtypebynamefixYong He
2020-06-05Merge pull request #1371 from csyonghe/loop_attribYong He
Emit [loop] attribute to output HLSL.
2020-06-05Fix FindTypeByName reflection API not finding stdlib types.Yong He