diff options
| author | Tim Foley <tfoleyNV@users.noreply.github.com> | 2017-11-15 10:50:15 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-11-15 10:50:15 -0800 |
| commit | 1a0a7f60df92e7aeb0043362900db3cbfa2a1ad0 (patch) | |
| tree | 21bebb83296d1cb6d74a275396e1eb18be5c4722 /source/slang/mangle.cpp | |
| parent | 59a4c0caed15b607990fdc1990992fb1b944ae96 (diff) | |
Various IR fixes for Falcor (#280)
- Change function mangling so we use `p<parameterCount>p` instead of just `p<parameterCount>` to avoid the parameter count running into digits at the start of a mangled type name and tripping up the un-mangling logic.
- We really need to step back at some point and define our mangling scheme a bit more carefully, especially if we are going to keep going down this road where un-mangling things is important for generating HLSL output.
- Also allow the unmangling logic to unmangle a few more cases of generic parameters, so that it can skip over them to get to the parameter count of the underlying function.
- Add a notion of an `unreachable` instruction to the IR, and emit it as the terminator (if needed) at the end of the last block for a function with a non-void return type.
- This does *not* implement any logic to emit a diagnostic if the `unreachable` turns out to be potentially reachable
- Fix a bug in IR specialization of generics where we can't create two different specializations of the same function, because both get registered in the same hash map
With all these fixes, testing in Falcor modified to use the full Slang compiler and IR for all HLSL/Slang:
- The UI and text rendering shaders yield HLSL that compiles without error; no idea if they actually *work*
- The ModelViewer shaders yield HLSL, but there are some issues (looks like type legalization isn't applying to stuff inside constant buffers)
Diffstat (limited to 'source/slang/mangle.cpp')
| -rw-r--r-- | source/slang/mangle.cpp | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/source/slang/mangle.cpp b/source/slang/mangle.cpp index 38c2b29a8..68fa7f31b 100644 --- a/source/slang/mangle.cpp +++ b/source/slang/mangle.cpp @@ -164,6 +164,13 @@ namespace Slang // parameter are they at the specified depth). emitName(context, genericParamIntVal->declRef.GetName()); } + else if( auto constantIntVal = dynamic_cast<ConstantIntVal*>(val) ) + { + // TODO: need to figure out what prefix/suffix is needed + // to allow demangling later. + emitRaw(context, "k"); + emit(context, (UInt) constantIntVal->value); + } else { SLANG_UNEXPECTED("unimplemented case in mangling"); @@ -277,11 +284,13 @@ namespace Slang // if( auto callableDeclRef = declRef.As<CallableDecl>()) { - emitRaw(context, "p"); - auto parameters = GetParameters(callableDeclRef); UInt parameterCount = parameters.Count(); + + emitRaw(context, "p"); emit(context, parameterCount); + emitRaw(context, "p"); + for(auto paramDeclRef : parameters) { emitType(context, GetType(paramDeclRef)); |
