Граф коммитов
75 Коммитов
Автор SHA1 Сообщение Дата
Chris Kitching 8042277672 Add hipify mappings for all CUDA headers that have HIP equivalents
I'm particularly running into issues with `device_types.h` in real
CUDA code...


[ROCm/clr commit: 7761f63bbc]
2017-11-28 17:23:06 +00:00
Chris Kitching c3dc74be1b Add an explicit check for proper rewriting of CUDA includes
[ROCm/clr commit: 642af94492]
2017-11-13 21:02:42 +00:00
Chris Kitching 98034c4e3f Add a preprocessor conditional to one of the tests
Hurrah, we can cope with ifdefs now (except for kernel launches)


[ROCm/clr commit: e8c1e7bb11]
2017-11-13 20:58:55 +00:00
Chris Kitching 83e450e2c7 Use proper clang diagnostics for printing warnings
Much pretty. Very wow

This gives users all the usual power when it comes to manipulating
clang diagnostics. People can pass -Werror can have hipify fail if
it doesn't completely translate a file, for example. Much nicer
than reinventing the wheel.


[ROCm/clr commit: 506deca07f]
2017-11-13 20:58:55 +00:00
Chris Kitching 842c8c28d7 Use a custom FrontendAction to simplify identifier translation
Most of what hipify does is really just replacing CUDA idenitifers
with HIP ones. CUDA function calls, preprocessor macro calls,
enum references, types, etc.

This is problematic: calls/types/enum-refs require name resolution
for the AST matcher to work. This fails in the presence of code
deleted by the preprocessor, and in two-pass template compilation.

Instead, we can simply hook the lexer and have it rewrite the
identifiers for us.

This approach means identifier transformations will work correctly
regardless of where they appear (and we get to delete lots of code)

- Fixes #260
- Helps a bit with #207 - it will still fail to translate kernel
calls in preprocessor-ignored code, but everything except kerel
launches should translate correctly now, even in
preprocessor-deleted code.


[ROCm/clr commit: 7a441aef10]
2017-11-13 20:58:54 +00:00
Chris Kitching e00c92d828 Add hipify mappings for all CUDA headers that have HIP equivalents
I'm particularly running into issues with `device_types.h` in real
CUDA code...


[ROCm/clr commit: 9014c89f04]
2017-11-13 17:20:07 +00:00
Chris Kitching 41d7a05974 Add a test that exposes #260
[ROCm/clr commit: 0afc6b2e95]
2017-11-13 16:18:15 +00:00
Chris Kitching 5ced4544eb Add a couple of missing CHECK directives to concurrentKernels.cu
[ROCm/clr commit: 4353fc06d7]
2017-11-13 16:17:19 +00:00
Chris Kitching eaa48e16c3 Remove commented else-block
A warning statement for _string literals_ seems a bit unhelpful.
There's no value in this being here.


[ROCm/clr commit: ec2a6ba446]
2017-10-27 20:12:33 +01:00
Chris Kitching 4e6ca773fa Decouple the statistics system from the code translation
The original implementation had the statistics system woken very
tightly into things like PPCallbacks, with counters duplicated
in two places, and all the output code duplicated. This made it
very difficult to alter the structure of the program without
breaking the statistics system.

Since the planned approach for solving the remaining preprocessor
bugs needs the introduction of a custom FrontendAction, and such
a restructure was incompatible with the way the statistics system
was set up, this rewrite was required.

'tis rather simpler now, mind you :D

This commit also fixes an issue where some stats were counted
twice, and allows `-print-stats` to operate independently of
`-stat-output`, allowing you to print stats to a file without
printing them to a terminal (or vice-versa).


[ROCm/clr commit: dd5a60054a]
2017-10-27 20:12:33 +01:00
Chris Kitching c6bc4f5249 Copy-paste less in the statistics printing code
[ROCm/clr commit: 5365a8638f]
2017-10-27 20:12:33 +01:00
Chris Kitching e9b8afaaeb Inline updateCountersExt
[ROCm/clr commit: 69d2555f17]
2017-10-27 20:12:32 +01:00
Chris Kitching 0b45e8d905 Update counter maps sanely
operator[] default-constructs the map value if no value exists
for that key. Default-construction of int yields a zero. So all
the manual faffing around is just unnecessary.


[ROCm/clr commit: cecc0782ef]
2017-10-27 20:12:32 +01:00
Chris Kitching b89133c2d4 Prefer references to pointers in updateCountersExt()
[ROCm/clr commit: 828552decb]
2017-10-27 20:12:32 +01:00
Chris Kitching f659ad0eeb Move string utility functions into their own translation unit
[ROCm/clr commit: ab824ebd47]
2017-10-27 20:12:32 +01:00
Chris Kitching dcd770f25a Extract LLVM compatibility code into its own translation unit
[ROCm/clr commit: 9478be8198]
2017-10-27 20:12:32 +01:00
Chris Kitching 43b9ce8b56 Remove unused field
[ROCm/clr commit: 9eeac22359]
2017-10-27 20:12:32 +01:00
Chris Kitching 3d0f71e803 Remove CUDA_EXCLUDES
An artefact from a now-defunct hack to avoid corrupting programs


[ROCm/clr commit: 51df93cf25]
2017-10-27 20:12:32 +01:00
Chris Kitching cf14905f11 Make unsupported actually be a bool...
[ROCm/clr commit: 417fc92482]
2017-10-27 20:12:31 +01:00
Chris Kitching 57c7a33674 Describe the LLVM we found
[ROCm/clr commit: c909c00494]
2017-10-27 19:39:41 +01:00
Chris Kitching ae21f6400c Update hipify-clang readme for simplified build process
[ROCm/clr commit: f25afde2f5]
2017-10-27 19:39:41 +01:00
Chris Kitching 4e924460b4 hipify does not add the hipLaunchParm option any more
This was removed a while ago - seems like it uses a different
variant of the launch kernel function now, so this is redundant.


[ROCm/clr commit: 47c8293eaf]
2017-10-27 19:39:41 +01:00
Chris Kitching 8f59de9d2b Use cmake's builtin mechanism for handling library locations
See [the documentation](https://cmake.org/cmake/help/v3.0/command/find_package.html)
for exactly how the search procedure works. If you want to use an
LLVM from a specific location, use CMAKE_PREFIX_PATH as normal.

No longer do we have a nonstandard HIPIFY_CLANG_LLVM_DIR variable
for people to learn about.


[ROCm/clr commit: de8dcf0ed2]
2017-10-27 19:39:40 +01:00
Chris Kitching 366c8b0dd5 Move the "LLVM found" print adjacent to the find_package call
Very surprising that LLVM's finder module doesn't print this
itself like _literally every other finder module_. Blarg.


[ROCm/clr commit: 5211d48ca1]
2017-10-27 19:39:40 +01:00
Chris Kitching 84b2696f56 We no longer rely on HIPIFY_CLANG_LLVM_DIR to disable hipify-clang
Since there's now an option for toggling hipify-clang, omitting the
path is no longer something we need to check for. We'll still
abort if LLVM isn't found, due to `REQUIRED`.


[ROCm/clr commit: a13e983215]
2017-10-27 19:39:40 +01:00
Chris Kitching 758c6ea57f Don't attempt to find test dependencies if tests are disabled
And while we're at it, introduce a handy program-finder macro


[ROCm/clr commit: 384646334c]
2017-10-27 19:39:40 +01:00
Chris Kitching 39b280d948 Use add_dependencies to avoid duplication of pkg_hip_base
[ROCm/clr commit: 414a473d5c]
2017-10-27 19:39:40 +01:00
Chris Kitching e7ae31f2ac Make BUILD_HIPIFY_CLANG a cmake option
Instead of deciding whether to build hipify-clang based on
the presence of an LLVM path on the command line, have an
explicit option.

Do we want this default-on or default-off? I've defaulted it to
on for now, but maybe we want the opposite?


[ROCm/clr commit: 497a776f6c]
2017-10-27 19:39:39 +01:00
Chris Kitching 7360326705 Greatly enhance handling of macros in kernel launches
All but the most contrived use of macros is now properly handled -
have a look at the new testcases this commit adds. You can have
macros in kernel calls, macros spanning chunks of your arguments,
the call, call parameters, or callee can all be macros or
partially macros.


[ROCm/clr commit: 6491c2c3eb]
2017-10-26 17:28:46 +01:00
Chris Kitching 58428d739c Simplify how kernel launch expressions get translated
It seems like there was a lot of machinery here that is no longer
needed now we have hipLaunchKernelGGL (which doesn't require us
to insert an extra argument into kernel functions). We no longer
need to waste cycles scanning the AST for callees.

We can literally just do "Take the callee expression, and dump
it into the first argument of hipLaunchKernelGGL()".


[ROCm/clr commit: a35d30e0b7]
2017-10-26 17:28:30 +01:00
Chris Kitching 74af29d66a Deduplicate preprocessor code
There's three functions here that all do the same thing...

There was also logic that looks for numeric literals and works
backwards to find the macro name from which they are expanded.
I previously introduced code that rewrites macro references at
expand-time in the `MacroExpands` callback, so that code is no
longer doing anything useful.


[ROCm/clr commit: 1ef68090ae]
2017-10-26 17:28:30 +01:00
Chris Kitching b25b17b6b3 Rewrite _all_ CUDA macro identifiers in the preprocessor
Calls to macros that were themselves CUDA API calls were often
being missed - this applies the identifier transform to macro
names at the callsites, too.


[ROCm/clr commit: 30e7e7d919]
2017-10-26 17:27:56 +01:00
Chris Kitching cf50b4f97a Don't special-case source locations for calls in macros
The source location for a call that's inside a macro body will,
by default, point into the macro definition itself. The original
logic was causing macro invocations to be overwritten, as I
explain here:
https://github.com/ROCm-Developer-Tools/HIP/issues/207#issuecomment-337521851

The existing PPCallbacks code is correctly rewriting macro
definitions, so the practical effect of this change is that AST
rewrites on code that's expanded from macros are no-ops.

It might be a performance optimisation to put a short-circiut at
the top of the AST callbacks to abort when faced with code that
was expanded from macros.

It might yet prove wise to do absolutely everything at lex-time...


[ROCm/clr commit: f7e65c5334]
2017-10-26 17:26:37 +01:00
Chris Kitching af81909cab Prefer early-return to deep nesting
A chain of 7 closing braces is never a great sign :D

In the process it became apparant that the unsupported flag
was being silently ignored, causing users to be left with cuda
API calls in their programs with no warning given. This has been
rectified for consistency.


[ROCm/clr commit: c1f4612176]
2017-10-26 17:26:37 +01:00
Chris Kitching 07fb675fe7 Do not process __fetch_builtin_* in cudaCall()
Fixes #205


[ROCm/clr commit: d5fd5e55c5]
2017-10-26 17:23:55 +01:00
Chris Kitching 31920efae1 Don't use now-defunct cmake variable in lit test config
[ROCm/clr commit: 8d91579dcf]
2017-10-24 20:52:51 +01:00
Chris Kitching 5ee04d16c5 Refactor cudaCall to prefer early return to deep nesting
Sorry for the invasive refactor, but this was making reasoning
about this function more difficult.


[ROCm/clr commit: b24b33ee2e]
2017-10-24 20:38:49 +01:00
Chris Kitching 4d23fb75e9 Split the giant lookup table into 3 smaller ones
Instead of having a single, enormous LUT for all CUDA names, let's
have separate ones for different types of entity. We often know
that we're looking at a typename, or a function name, or a macro
name - so we can be more efficient (and resilient to name
collisions) by having smaller lookup tables for each of those
classes of entity).

Here we start that off by having three LUTs:
- Header names
- Type names
- Everything else

Future work could usefully split "everything else" into:
- enum values
- macro names
- function names
- everything else

It's worth noting that the "needs new matcher" todos I delete here
were actually resolved with the previous commit. It no longer
naively searches for things that start with "cu*" - it will find
exactly those things that are present in our lookup tables.


[ROCm/clr commit: 9da456b315]
2017-10-24 20:38:49 +01:00
Chris Kitching a00a5e3101 One matcher for type expressions to rule them all
Previously, there were different AST matchers for each
language construct that contains a type reference, and custom
logic to perform the transformation within each of those
structures.

Since the transformation in all such cases was only replacing
CUDA types with hip ones, we can instead use an AST matcher
that finds and updates the type references directly.
This simplifies the program considerably, and it won't fail
when it finds a language feature (or complicated type expression)
that nobody wrote custom logic for yet.


[ROCm/clr commit: 93c9b3ca34]
2017-10-24 20:38:49 +01:00
Chris Kitching 1a53e259b3 Make control flow less insane
`while(false)` is certainly a bold choice.


[ROCm/clr commit: 3b2d8029fb]
2017-10-24 20:38:49 +01:00
Chris Kitching 02d3a34917 Use a cmake glob for collecting hipify sources
Should make breaking this monstrosity into multiple files a bit
easier...


[ROCm/clr commit: 9a4778f435]
2017-10-24 20:38:48 +01:00
Chris Kitching bbac7c8b82 Move giant lookup table into another translation unit
Also, rewrote it as a constant variable instead of a function
that imperatively fills a map. It's shorter, faster the compile,
and (depending on how badly the compiler screws it up) maybe
faster to run.

And, of course, it starts breaking up that giant .cpp file.


[ROCm/clr commit: 803d3ffd9c]
2017-10-24 20:38:25 +01:00
Chris Kitching 482541bb8c Tweak some version numbers in clang version compatibility checks
Apparently a couple of those APIs changed in clang 5, not 4.

Drat.


[ROCm/clr commit: aa288fcf1f]
2017-10-24 01:45:23 +01:00
Chris Kitching 26be50b082 Add concurentKernels.cu to the testsuite
[ROCm/clr commit: 2c65d0da37]
2017-10-23 13:39:37 +01:00
Chris Kitching 8fffd03350 Add the CUDA samples include dir to the path for tests
Means we get to easily steal CUDA examples for tests


[ROCm/clr commit: 64d5f07050]
2017-10-23 13:39:37 +01:00
Chris Kitching 7547f796d0 Add cudaRegister.cu lit test
[ROCm/clr commit: 2437b31939]
2017-10-23 13:39:37 +01:00
Chris Kitching 8fd3b3b1cd Add square.cu to lit testsuite
[ROCm/clr commit: ead79e5bf4]
2017-10-23 13:39:37 +01:00
Chris Kitching 8b311424a6 Introduce a test runner script to simplify invocation
... And to use a standard, highly amusing trick for making
coloured output work.


[ROCm/clr commit: c99dcbba8d]
2017-10-23 13:39:37 +01:00
Chris Kitching 4e80782cda Adapt lit test for the hipLaunchKernelGGL changes from before...
[ROCm/clr commit: 5912f465bd]
2017-10-23 13:39:37 +01:00
Chris Kitching 0f6c153774 Migrate lit test to using FileCheck, so failures are readable
It seems the test is already broken, but look how awesome the
error message is now:

/home/chris/HIP/tests/hipify-clang/axpy.cu:31:12: error: expected string not found in input
 // CHECK: hipLaunchKernel(HIP_KERNEL_NAME(axpy), dim3(1), dim3(kDataLen), 0, 0, a, device_x, device_y);
           ^
<stdin>:31:2: note: scanning from here
 //
 ^
<stdin>:33:2: note: possible intended match here
 hipLaunchKernelGGL(axpy, dim3(1), dim3(kDataLen), 0, 0, a, device_x, device_y);
 ^


[ROCm/clr commit: 74fd64d5c1]
2017-10-23 13:39:37 +01:00
Chris Kitching d92c43bd21 Look for FileCheck for running lit tests, too
Use of grep in `lit` RUN lines is deprecated:
https://llvm.org/docs/TestingGuide.html#writing-new-regression-tests

Using grep leads to really unhelpful failure output (it literally
just says "the test failed"). FileCheck is much more helpful, and
distributed with LLVM on most distros anyway, so this extra
dependency shouldn't prove problematic.


[ROCm/clr commit: 3868036ea7]
2017-10-23 13:39:36 +01:00
Chris Kitching baabd2755e Propagate the CUDA toolkit directory into the lit tests
Allows the tests to actually run... :D


[ROCm/clr commit: 9747578d09]
2017-10-23 13:39:36 +01:00
Chris Kitching 49e43a7fc1 Remove dependency on nonexistent lit target
This just... isn't a target. Maybe you were trying to do a file
dependency? But that's handled implicitly by the find_program
call anyway, so all this is doing is generating a cmake warning


[ROCm/clr commit: e9d259699c]
2017-10-23 13:39:36 +01:00
Chris Kitching d0feaee4f4 Avoid a double-free of HipifyPPCallbacks instance
This bug was present all along, but something changed in the order
of de-initialisation performed by llvm that makes it actually
crash now.

The constructor of HipifyPPCallbacks gives:
```
std::unique_ptr<HipifyPPCallbacks>(this)
```
to the LLVM Preprocessor instance. The Preprocessor instance
subsequently frees the HipifyPPCallbacks, which is then freed
again when we leave the stack frame at line 4340.

So: let's leak the HipifyPPCallbacks onto the heap, and leave
the LLVM Preprocessor object responsible for tidying it up.


[ROCm/clr commit: 893ee6d6ca]
2017-10-19 17:09:32 +01:00
Chris Kitching 64a26027b7 Be agnostic to the new getReplacements() API
See comment


[ROCm/clr commit: a06fe54ee8]
2017-10-19 17:08:55 +01:00
Chris Kitching 5e09ca10b7 Use inline initialisers to set default field values
A trivial cleanup that helps in a moment..


[ROCm/clr commit: 9d83348ac7]
2017-10-19 17:08:55 +01:00
Chris Kitching fd9bc0d0d8 Omit now-removed Filename string arg from handleBeginSource
[ROCm/clr commit: abd34b2125]
2017-10-19 17:08:55 +01:00
Chris Kitching a21737be39 Cope with Replacements now having llvm::Error returns
[ROCm/clr commit: 885573e1e2]
2017-10-19 17:08:54 +01:00
Chris Kitching db2b03b879 Cope with clang 4.0's rename of getNumArgs()
Sorry, this one I couldn't do in a perfectly elegant way ;)


[ROCm/clr commit: 9ccb966e2b]
2017-10-19 17:08:54 +01:00
Chris Kitching ae40d4bdea Remove unnecessary call to Retain() on a smart pointer
The Preprocessor smart pointer is held by the CompilerInstance,
and therefore its reference count cannot reach zero until the
CompilerInstance itself is destroyed.

If the CompilerInstance is destroyed, you have more to worry about
than just the preprocessor being deallocated!

Newer versions of the LLVM/Clang API migrated to using
std::shared_ptr, so there is no `Retain()` function (by that
name, anyway). Eliminating this redundant use is a neat and
backward-compatible way to become compatible with newer versions
of the LLVM/Clang API.


[ROCm/clr commit: 22a5e2330d]
2017-10-19 17:08:54 +01:00
Chris Kitching 3f284c0927 Refer to clang::StringLiteral explicitly
Newer versions of llvm/clang mean there is both an
llvm::StringLiteral and a clang::StringLiteral. Since we're
dumping both namespaces wholesale into the global namespace with
`using` declarations, this creates a name collision, which must be
resolved.

This change is backwards-compatible, and fixes a problem you
encounter when using newer versions of the llvm/clang API.


[ROCm/clr commit: 73984ed809]
2017-10-19 17:08:54 +01:00
Chris Kitching 17903e9dbd Fix two faulty LLVM version checks
What we actually want to do here is use the StringRef version in
versions newer than 3.8, and the void one in 3.8 and older.

Checking "major-version >= 3 && minor-version >= 9" does not do
what we want. Consider what this will do for version 4.0, for
which minor-version is zero...


[ROCm/clr commit: c876f6ffd5]
2017-10-19 17:08:54 +01:00
Chris Kitching 37764de428 Use the cache for global variables - not PARENT_SCOPE hacks
[ROCm/clr commit: ed6681f563]
2017-10-19 17:08:54 +01:00
Chris Kitching f736f861b8 Skip lit tests if lit cannot be found
[ROCm/clr commit: 6abd8963ae]
2017-10-19 17:08:54 +01:00
Chris Kitching 95e1706537 Don't reinvent find_package
PythonInterp is a finder module that ships with cmake. It supports
the conventional interaction with find_package that allows you
to demand success, and particular vesions, without having your
own logic:

https://cmake.org/cmake/help/v3.0/command/find_package.html


[ROCm/clr commit: c62766f880]
2017-10-19 17:08:53 +01:00
Chris Kitching 35943634ea Don't be picky about clang versions
[ROCm/clr commit: 03dd8c9fca]
2017-10-19 17:08:53 +01:00
Chris Kitching 9eac4a2012 Declare HIPIFY_CLANG_TESTS as a cmake option
[ROCm/clr commit: b926cdf002]
2017-10-19 17:08:53 +01:00
Chris Kitching 28ebdf5379 Use early return to avoid indenting all of CMakeLists.txt
[ROCm/clr commit: d3a5646051]
2017-10-19 17:08:53 +01:00
Chris Kitching a0c26d39f9 Fix broken indentation introduced by previous commit
[ROCm/clr commit: 72c9767b1d]
2017-10-19 17:08:53 +01:00
Chris Kitching 5cbaf06867 Inline a redundant std::vector
Looks like a partial refactor..?


[ROCm/clr commit: 6165b65d21]
2017-10-19 14:11:25 +01:00
Chris Kitching ddd6304971 Allow user-provided -std=* argument to override the default
This means any user-provided -std=* argument overrides this one,
allowing use of newer standards.


[ROCm/clr commit: 90b04f696b]
2017-10-19 14:11:15 +01:00
Chris Kitching c3f743a763 Add [[nodiscard]] attribute to hipError_t in C++17 mode
This will yield a compiler warning any time you discard an error
return value from an API call.


[ROCm/clr commit: 939fa02ade]
2017-10-19 13:34:02 +01:00
Chris Kitching bbc7a86d2c Unconditionally append .hip as the default output filename
[ROCm/clr commit: dbbd6d576d]
2017-10-18 19:19:18 +01:00
Chris Kitching 756aca43f9 If an output path is given _use it_
Don't append .hip to a user-provided output file...


[ROCm/clr commit: 14061bf0e6]
2017-10-16 17:32:57 +01:00
Chris Kitching 40b7c1f9a1 Operate on a temp file in-place
This copies to the output after operation, instead of working
_on_ the output. This allows includes to work correctly, while
supporting output paths anywhere on the filesystem.

Fixes #208
Fixes #206


[ROCm/clr commit: bd8a90a05b]
2017-10-16 17:32:56 +01:00