summaryrefslogtreecommitdiffstats
path: root/clang/utils
Commit message (Collapse)AuthorAgeFilesLines
* Implement target-specific __attribute__((aligned)) valueUlrich Weigand2015-04-211-5/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The GCC construct __attribute__((aligned)) is defined to set alignment to "the default alignment for the target architecture" according to the GCC documentation: The default alignment is sufficient for all scalar types, but may not be enough for all vector types on a target that supports vector operations. The default alignment is fixed for a particular target ABI. clang currently hard-coded an alignment of 16 bytes for that construct, which is correct on some platforms (including X86), but wrong on others (including SystemZ). Since this value is ABI-relevant, it is important to get correct for compatibility purposes. This patch adds a new TargetInfo member "DefaultAlignForAttributeAligned" that targets can set to the appropriate default __attribute__((aligned)) value. Note that I'm deliberately *not* using the existing "SuitableAlign" value, which is used to set the pre-defined macro __BIGGEST_ALIGNMENT__, since those two values may not be the same on all platforms. In fact, on X86, __attribute__((aligned)) always uses 16-byte alignment, while __BIGGEST_ALIGNMENT__ may be larger if AVX-2 or AVX-512 are supported. (This is actually not yet correctly implemented in clang either.) The patch provides a value for DefaultAlignForAttributeAligned only for SystemZ, and leaves the default for all other targets at 16, which means no visible change in behavior on all other targets. (The value is still wrong for some other targets, but I'd prefer to leave it to the target maintainers for those platforms to fix.) llvm-svn: 235397
* Remove empty non-virtual destructors or mark them =default when non-publicBenjamin Kramer2015-04-111-8/+0
| | | | | | These add no value but can make a class non-trivially copyable. NFC. llvm-svn: 234689
* Use 'override/final' instead of 'virtual' for overridden methodsAlexander Kornienko2015-04-111-15/+15
| | | | | | | | | | | | | | | | | | | | Summary: The patch is generated using clang-tidy misc-use-override check. This command was used: tools/clang/tools/extra/clang-tidy/tool/run-clang-tidy.py \ -checks='-*,misc-use-override' -header-filter='llvm|clang' -j=32 -fix Reviewers: dblaikie Reviewed By: dblaikie Subscribers: klimek, cfe-commits Differential Revision: http://reviews.llvm.org/D8926 llvm-svn: 234678
* [tblgen] Use StringRef::trimBenjamin Kramer2015-04-101-24/+5
| | | | llvm-svn: 234643
* Fix a call to std::unique to actually discard the trailing (junk) elements.James Dennett2015-04-061-1/+2
| | | | | | Found by inspection. (No other instances of this problem were found.) llvm-svn: 234221
* [utils] Add Check Compile Flow Consistency tool (check_cfc.py).Russell Gallop2015-04-025-0/+649
| | | | | | | | | | | | This is a tool for checking consistency of code generation with different compiler options (such as -g or outputting to .s). This tool has found a number of code generation issues. The script acts as a wrapper to clang or clang++ performing 2 (or more) compiles then comparing the object files. Instructions for use are in check_cfc.py including how to use with LNT. Differential Revision: http://reviews.llvm.org/D8723 llvm-svn: 233919
* Devirtualize Attr and all subclasses.Benjamin Kramer2015-03-191-12/+39
| | | | | | | | | | | | We know all subclasses in tblgen so just generate a giant switch for the few virtual methods or turn them into a member variable using spare bits. The giant jump tables aren't pretty but still much smaller than a vtable for every attribute, shrinking Release+Asserts clang by ~400k. Also halves the size of the Attr base class. No functional change intended. llvm-svn: 232726
* Remove many superfluous SmallString::str() calls.Yaron Keren2015-03-181-1/+1
| | | | | | | | | | | | | | | Now that SmallString is a first-class citizen, most SmallString::str() calls are not required. This patch removes a whole bunch of them, yet there are lots more. There are two use cases where str() is really needed: 1) To use one of StringRef member functions which is not available in SmallString. 2) To convert to std::string, as StringRef implicitly converts while SmallString do not. We may wish to change this, but it may introduce ambiguity. llvm-svn: 232622
* Make helper functions static. NFC.Benjamin Kramer2015-03-101-1/+4
| | | | llvm-svn: 231811
* The semantic spelling enumeration should retain values to the spelling list ↵Aaron Ballman2015-03-101-1/+5
| | | | | | | | | | indexes used by the attribute. The only attribute affected by this in practice is the OpenCLImageAccessAttr, which has duplicate semantic spellings that are automatically stripped. We do not implicitly create an OpenCLImageAccessAttr, so this change only affects out of tree users. There is no way to test this behavior specifically that I can see, since this only affects implicit creation of attributes. Fixes PR22403. llvm-svn: 231803
* Teach raw_ostream to accept SmallString.Yaron Keren2015-03-101-2/+2
| | | | | | | | | | | | | | Saves adding .str() call to any raw_ostream << SmallString usage and a small step towards making .str() consistent in the ADTs by removing one of the SmallString::str() use cases, discussion at http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20141013/240026.html I'll update the Phabricator patch http://reviews.llvm.org/D6372 for review of the Twine SmallString support, it's more complex than this one. llvm-svn: 231763
* Replace size() calls on containers with empty() calls where appropriate. NFCAlexander Kornienko2015-01-232-3/+3
| | | | | | | | http://reviews.llvm.org/D7090 Patch by Gábor Horváth! llvm-svn: 226914
* [cleanup] Re-sort the #include lines using llvm/utils/sort_includes.pyChandler Carruth2015-01-142-4/+4
| | | | | | | No functionality changed, this is a purely mechanical cleanup to ensure the #include order remains consistent across the project. llvm-svn: 225975
* Attributes accepting an EnumArgument are allowed to pass a string literal, ↵Aaron Ballman2014-12-191-0/+1
| | | | | | | | or an identifier. VariadicEnumArguments now behave consistently instead of only accepting a string literal. This change affects the only attribute accepting a variadic enumeration: callable_when. llvm-svn: 224582
* Modify __has_attribute so that it only looks for GNU-style attributes. ↵Aaron Ballman2014-12-051-3/+0
| | | | | | Removes the ability to look for generic attributes and keywords via this macro, which has the potential to be a breaking change. However, since there is __has_cpp_attribute and __has_declspec_attribute, and given the limited usefulness of querying a generic attribute name regardless of syntax, this seems like the correct path forward. llvm-svn: 223468
* Create a new 'flag_enum' attribute.Alexis Hunt2014-11-281-1/+6
| | | | | | | | | | | This attribute serves as a hint to improve warnings about the ranges of enumerators used as flag types. It currently has no working C++ implementation due to different semantics for enums in C++. For more explanation, see the docs and testcases. Reviewed by Aaron Ballman. llvm-svn: 222906
* Fixing a use of stringstream to use an LLVM helper function. Drive-by fixing ↵Aaron Ballman2014-11-171-7/+3
| | | | | | header include order. NFC. llvm-svn: 222151
* MinGW doesn't implement std::to_string; working around it. NFC.Aaron Ballman2014-11-141-1/+6
| | | | llvm-svn: 222033
* Complete support for the SD-6 standing document (based off N4200) with ↵Aaron Ballman2014-11-141-9/+30
| | | | | | support for __has_cpp_attribute. llvm-svn: 221991
* [analyzer] Rename NewDeleteLeaks checker in the test script.Anna Zaks2014-10-311-1/+1
| | | | | | Fixup to r220289. llvm-svn: 220976
* Refactor tree printing in AST dumping.Richard Smith2014-10-301-26/+4
| | | | | | | | | | | Instead of manually maintaining a flag indicating whether we're about to print out the last child of the parent node (to determine whether we print "`" or "|"), capture a callable to print that child and defer printing it until we either see a next child or finish the parent. No functionality change intended. llvm-svn: 220930
* Allow constant expressions in pragma loop hints.Tyler Nowicki2014-10-121-4/+26
| | | | | | | | Previously loop hints such as #pragma loop vectorize_width(#) required a constant. This patch allows a constant expression to be used as well. Such as a non-type template parameter or an expression (2 * c + 1). Reviewed by Richard Smith llvm-svn: 219589
* Adding some FIXMEs to the attribute emitter code regarding whether pretty ↵Aaron Ballman2014-09-151-0/+6
| | | | | | printing enumerators should use quoted string literals, or identifiers. NFC. llvm-svn: 217781
* When pretty printing attributes that have enumeration arguments, print the ↵Aaron Ballman2014-09-151-6/+50
| | | | | | enumerator identifier (as a string literal) instead of the internal enumerator integral value. llvm-svn: 217771
* Simplify creation of a bunch of ArrayRefs by using None, makeArrayRef or ↵Craig Topper2014-08-271-1/+1
| | | | | | just letting them be implicitly created. llvm-svn: 216528
* Fix invalid test generation by utils/ABITest/ABITestGen.py when the same ↵Daniel Sanders2014-08-212-2/+6
| | | | | | | | | | | | | | | | | | | | | | | enum is generated more than once. When generating records/unions, the same enum type may be generated more than once (with different names). In these cases, the name of the enum values are not sufficiently unique to prevent multiple declarations. E.g: typedef enum T3 { enum0val0 } T3; typedef T3 T2[3]; typedef enum T4 { enum0val0 } T4; typedef union T1 { T2 field0; T4 field1; char field2; } T1; Added a unique suffix to enum values so that multiple identical enum types do not use the same enum value names. One example of this bug is produced by: ABITestGen.py --no-unsigned --no-vector --no-complex --no-bool \ --max-args 0 --max-record-depth 1 -o inputs/test.9921.a.c \ -T inputs/test.9921.b.c -D inputs/test.9921.driver.c \ --min=9921 --count=1 llvm-svn: 216166
* Remove some transient raw pointer ownership in ClangAttrEmitter::createArgumentDavid Blaikie2014-08-081-23/+28
| | | | | | | | This function might be a bit easier if it were split in two with a lot of early returns - and that setOptional bit in the outer function, but anyway. llvm-svn: 215263
* Add missing header guards.Benjamin Kramer2014-08-081-0/+5
| | | | llvm-svn: 215202
* The GNU-style aligned attribute has an optional expression, but the ↵Aaron Ballman2014-08-011-3/+9
| | | | | | | | generated pretty printing logic was unaware of this. Fixed the pretty printing logic, and added a test to ensure it no longer asserts. Added a FIXME to the code about eliding the parenthesis when pretty printing such a construct. llvm-svn: 214513
* Automate attribute argument count semantic checking when there are variadic ↵Aaron Ballman2014-07-311-1/+13
| | | | | | | | or optional arguments present. With this, the only time you should have to manually check attribute argument counts is when HasCustomParsing is set to true, or when you have variadic arguments that aren't really variadic (like ownership_holds and friends). Updating the diagnostics in the launch_bounds test since they have been improved in that case. Adding a test for nonnull since it has little test coverage, but has truly variadic arguments. llvm-svn: 214407
* Specifying the diagnostic argument through the attribute table generator ↵Aaron Ballman2014-07-161-0/+2
| | | | | | | | instead of having to enter it manually as part of the attribute subject list. This only affects attributes appertaining to ObjC interfaces and protocols. No new tests required as this is covered by existing tests. llvm-svn: 213193
* Fix typosAlp Toker2014-07-141-4/+3
| | | | | | Also consolidate 'backward compatibility' llvm-svn: 212974
* [ARM-BE] Generate correct NEON intrinsics for big endian systems.James Molloy2014-06-271-62/+172
| | | | | | | | | | | | | The NEON intrinsics in arm_neon.h are designed to work on vectors "as-if" loaded by (V)LDR. We load vectors "as-if" (V)LD1, so the intrinsics are currently incorrect. This patch adds big-endian versions of the intrinsics that does the "obvious but dumb" thing of reversing all vector inputs and all vector outputs. This will produce extra REVs, but we trust the optimizer to remove them. llvm-svn: 211893
* Add a Visualizer for VarDecl.Zachary Turner2014-06-261-6/+21
| | | | | | | | Reviewed by: Aaron Ballman Differential Revision: http://reviews.llvm.org/D4303 llvm-svn: 211788
* Fixing the position of the supported syntax marker when generating attribute ↵Aaron Ballman2014-06-251-1/+1
| | | | | | documentation. llvm-svn: 211692
* Replace some assert(0)'s with llvm_unreachable.Craig Topper2014-06-181-2/+1
| | | | llvm-svn: 211143
* Replace some assert(0)'s with llvm_unreachable.Craig Topper2014-06-181-6/+6
| | | | llvm-svn: 211139
* Convert assert(0) to llvm_unreachable to silence a warning about Addend ↵Craig Topper2014-06-181-1/+1
| | | | | | being uninitialized in default case. llvm-svn: 211138
* Rewrite ARM NEON intrinsic emission completely.James Molloy2014-06-172-2982/+1846
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | There comes a time in the life of any amateur code generator when dumb string concatenation just won't cut it any more. For NeonEmitter.cpp, that time has come. There were a bunch of magic type codes which meant different things depending on the context. There were a bunch of special cases that really had no reason to be there but the whole thing was so creaky that removing them would cause something weird to fall over. There was a 1000 line switch statement for code generation involving string concatenation, which actually did lexical scoping to an extent (!!) with a bunch of semi-repeated cases. I tried to refactor this three times in three different ways without success. The only way forward was to rewrite the entire thing. Luckily the testing coverage on this stuff is absolutely massive, both with regression tests and the "emperor" random test case generator. The main change is that previously, in arm_neon.td a bunch of "Operation"s were defined with special names. NeonEmitter.cpp knew about these Operations and would emit code based on a huge switch. Actually this doesn't make much sense - the type information was held as strings, so type checking was impossible. Also TableGen's DAG type actually suits this sort of code generation very well (surprising that...) So now every operation is defined in terms of TableGen DAGs. There are a bunch of operators to use, including "op" (a generic unary or binary operator), "call" (to call other intrinsics) and "shuffle" (take a guess...). One of the main advantages of this apart from making it more obvious what is going on, is that we have proper type inference. This has two obvious advantages: 1) TableGen can error on bad intrinsic definitions easier, instead of just generating wrong code. 2) Calls to other intrinsics are typechecked too. So we no longer need to work out whether the thing we call needs to be the Q-lane version or the D-lane version - TableGen knows that itself! Here's an example: before: case OpAbdl: { std::string abd = MangleName("vabd", typestr, ClassS) + "(__a, __b)"; if (typestr[0] != 'U') { // vabd results are always unsigned and must be zero-extended. std::string utype = "U" + typestr.str(); s += "(" + TypeString(proto[0], typestr) + ")"; abd = "(" + TypeString('d', utype) + ")" + abd; s += Extend(utype, abd) + ";"; } else { s += Extend(typestr, abd) + ";"; } break; } after: def OP_ABDL : Op<(cast "R", (call "vmovl", (cast $p0, "U", (call "vabd", $p0, $p1))))>; As an example of what happens if you do something wrong now, here's what happens if you make $p0 unsigned before the call to "vabd" - that is, $p0 -> (cast "U", $p0): arm_neon.td:574:1: error: No compatible intrinsic found - looking up intrinsic 'vabd(uint8x8_t, int8x8_t)' Available overloads: - float64x2_t vabdq_v(float64x2_t, float64x2_t) - float64x1_t vabd_v(float64x1_t, float64x1_t) - float64_t vabdd_f64(float64_t, float64_t) - float32_t vabds_f32(float32_t, float32_t) ... snip ... This makes it seriously easy to work out what you've done wrong in fairly nasty intrinsics. As part of this I've massively beefed up the documentation in arm_neon.td too. Things still to do / on the radar: - Testcase generation. This was implemented in the previous version and not in the new one, because - Autogenerated tests are not being run. The testcase in test/ differs from the autogenerated version. - There were a whole slew of special cases in the testcase generation that just felt (and looked) like hacks. If someone really feels strongly about this, I can try and reimplement it too. - Big endian. That's coming soon and should be a very small diff on top of this one. llvm-svn: 211101
* Use the ShowInSystemHeader bit consistently for all diagnosticsAlp Toker2014-06-161-2/+1
| | | | | | | | | | | | By describing system header suppressions directly in tablegen we eliminate special cases in getDiagnosticSeverity(). Dropping the reliance on builtin diagnostic classes when mapping also gets us closer to the goal of reusing the diagnostic machinery for custom diagnostics. No change in functionality. llvm-svn: 211023
* Adds a Pragma spelling for attributes to tablegen and makes use of it for loopTyler Nowicki2014-06-131-24/+53
| | | | | | | | | hint attributes. Includes tests for pragma printing and for attribute order which is incorrectly reversed by ParsedAttributes. Reviewed by Aaron Ballman llvm-svn: 210925
* Complete the switch from mappings to declarative diagnostic severitiesAlp Toker2014-06-121-3/+5
| | | | | | | | | This begins to address cognitive dissonance caused by treating the Note diagnostic level as a severity in the diagnostic engine. No change in functionality. llvm-svn: 210758
* Removing an "if (this == nullptr)" check from two print methods. The conditionRichard Trieu2014-06-091-3/+5
| | | | | | | will never be true in a well-defined context. The checking for null pointers has been moved into the caller logic so it does not rely on undefined behavior. llvm-svn: 210498
* Make Attr::Clone() also clone the Inherited, IsPackExpansion and Implicit flagsHans Wennborg2014-05-311-2/+6
| | | | | | | | | | I was bitten by this when working with the dll attributes: when a dll attribute was cloned from a class template declaration to its specialization, the Inherited flag didn't get cloned. Differential Revision: http://reviews.llvm.org/D3972 llvm-svn: 209950
* Refactoring. Remove release and take methods from ActionResult. Rename ↵Nikola Smiljanic2014-05-291-2/+2
| | | | | | takeAs to getAs. llvm-svn: 209800
* utils/CmpDriver: add brief documentation to indicate what this doesAlp Toker2014-05-211-0/+5
| | | | llvm-svn: 209268
* Cleaning up some range-based for loops so that the automatic type deduction ↵Aaron Ballman2014-05-201-74/+75
| | | | | | is more explicit about pointers and const. Did some minor drive-by const correctness fixes and identifier updates as well. No functional changes. llvm-svn: 209233
* None of these attributes require FunctionTemplate to be explicitly listed as ↵Aaron Ballman2014-05-201-6/+3
| | | | | | | | part of their subject definition. FunctionTemplateDecls are not what the attribute appertains to in the first place -- it attaches to the underlying FunctionDecl. The attribute emitter was using FunctionTemplate to map the diagnostic to "functions or methods", but that isn't a particularly clear diagnostic in these cases anyway (since they do not apply to ObjC methods). Updated the attribute emitter to remove custom logic for FunctionTemplateDecl, and updated the test cases for the change in diagnostic wording. llvm-svn: 209209
* [C++11] Use 'nullptr'.Craig Topper2014-05-075-10/+11
| | | | llvm-svn: 208163
* tblgen: Modularize the diagnostic emitterTobias Grosser2014-05-061-88/+198
| | | | | | | | | | | | | | | | | | | Replace a large monolitic function, with per-table functions which all nicely fit on my screen. I also added documentation to each function that describes what kind of tables are generated and which information is contained and switched to range based for loops. Finally, I run clang-format over the moved code. I spent a significant amount of time to understand this code when reasoning about possible extensions to the diagnostic interface to support 'remark' diagnostics. This change will definitely help such an implementation, but already by itself it will save other people a lot of time when trying to understand this functionality. Even though the patch touches the full function, it is mostly mechanical. No functional change intended. The generated tblgen files are identical. llvm-svn: 208136
OpenPOWER on IntegriCloud