#
6a484832 |
| 13-Jan-2015 |
Duncan P. N. Exon Smith <dexonsmith@apple.com> |
AsmParser/Bitcode: Add support for MDLocation
This adds assembly and bitcode support for `MDLocation`. The assembly side is rather big, since this is the first `MDNode` subclass (that isn't `MDTupl
AsmParser/Bitcode: Add support for MDLocation
This adds assembly and bitcode support for `MDLocation`. The assembly side is rather big, since this is the first `MDNode` subclass (that isn't `MDTuple`). Part of PR21433.
(If you're wondering where the mountains of testcase updates are, we don't need them until I update `DILocation` and `DebugLoc` to actually use this class.)
llvm-svn: 225830
show more ...
|
#
49503f82 |
| 12-Jan-2015 |
Duncan P. N. Exon Smith <dexonsmith@apple.com> |
Bitcode: Range-based for, NFC
llvm-svn: 225716
|
#
b1ad5d39 |
| 12-Jan-2015 |
Duncan P. N. Exon Smith <dexonsmith@apple.com> |
Bitcode: Add abbreviation for METADATA_NAME
llvm-svn: 225715
|
#
f8dd6ad6 |
| 12-Jan-2015 |
Duncan P. N. Exon Smith <dexonsmith@apple.com> |
Bitcode: Range-based for, NFC
llvm-svn: 225714
|
#
73d5aae7 |
| 12-Jan-2015 |
Duncan P. N. Exon Smith <dexonsmith@apple.com> |
Bitcode: Range-based for, NFC
llvm-svn: 225713
|
#
2fcf60e7 |
| 12-Jan-2015 |
Duncan P. N. Exon Smith <dexonsmith@apple.com> |
Bitcode: Simplify emission of METADATA_BLOCK
Refactor logic so that we know up-front whether to open a block and whether we need an MDString abbreviation.
This is almost NFC, but will start emittin
Bitcode: Simplify emission of METADATA_BLOCK
Refactor logic so that we know up-front whether to open a block and whether we need an MDString abbreviation.
This is almost NFC, but will start emitting `MDString` abbreviations when the first record is not an `MDString`.
llvm-svn: 225712
show more ...
|
#
9ed19665 |
| 09-Jan-2015 |
Duncan P. N. Exon Smith <dexonsmith@apple.com> |
Revert "Bitcode: Move the DEBUG_LOC record to DEBUG_LOC_OLD"
This reverts commit r225498 (but leaves r225499, which was a worthy cleanup).
My plan was to change `DEBUG_LOC` to store the `MDNode` di
Revert "Bitcode: Move the DEBUG_LOC record to DEBUG_LOC_OLD"
This reverts commit r225498 (but leaves r225499, which was a worthy cleanup).
My plan was to change `DEBUG_LOC` to store the `MDNode` directly rather than its operands (patch was to go out this morning), but on reflection it's not clear that it's strictly better. (I had missed that the current code is unlikely to emit the `MDNode` at all.)
Conflicts: lib/Bitcode/Reader/BitcodeReader.cpp (due to r225499)
llvm-svn: 225531
show more ...
|
#
11fae74a |
| 09-Jan-2015 |
Duncan P. N. Exon Smith <dexonsmith@apple.com> |
Bitcode: Move the DEBUG_LOC record to DEBUG_LOC_OLD
Prepare to simplify the `DebugLoc` record.
llvm-svn: 225498
|
#
090a19bd |
| 08-Jan-2015 |
Duncan P. N. Exon Smith <dexonsmith@apple.com> |
IR: Add 'distinct' MDNodes to bitcode and assembly
Propagate whether `MDNode`s are 'distinct' through the other types of IR (assembly and bitcode). This adds the `distinct` keyword to assembly.
Cu
IR: Add 'distinct' MDNodes to bitcode and assembly
Propagate whether `MDNode`s are 'distinct' through the other types of IR (assembly and bitcode). This adds the `distinct` keyword to assembly.
Currently, no one actually calls `MDNode::getDistinct()`, so these nodes only get created for:
- self-references, which are never uniqued, and - nodes whose operands are replaced that hit a uniquing collision.
The concept of distinct nodes is still not quite first-class, since distinct-ness doesn't yet survive across `MapMetadata()`.
Part of PR22111.
llvm-svn: 225474
show more ...
|
#
261d25b9 |
| 08-Jan-2015 |
Rafael Espindola <rafael.espindola@gmail.com> |
clang-format. NFC.
llvm-svn: 225454
|
Revision tags: llvmorg-3.5.1, llvmorg-3.5.1-rc2 |
|
#
eca1e031 |
| 11-Dec-2014 |
Duncan P. N. Exon Smith <dexonsmith@apple.com> |
Bitcode: Use unsigned char to record MDStrings
`MDString`s can have arbitrary characters in them. Prevent an assertion that fired in `BitcodeWriter` because of sign extension by copying the charact
Bitcode: Use unsigned char to record MDStrings
`MDString`s can have arbitrary characters in them. Prevent an assertion that fired in `BitcodeWriter` because of sign extension by copying the characters into the record as `unsigned char`s.
Based on a patch by Keno Fischer; fixes PR21882.
llvm-svn: 224077
show more ...
|
#
5c7006e0 |
| 11-Dec-2014 |
Duncan P. N. Exon Smith <dexonsmith@apple.com> |
Bitcode: Add METADATA_NODE and METADATA_VALUE
This reflects the typelessness of `Metadata` in the bitcode format, removing types from all metadata operands.
`METADATA_VALUE` represents a `ValueAsMe
Bitcode: Add METADATA_NODE and METADATA_VALUE
This reflects the typelessness of `Metadata` in the bitcode format, removing types from all metadata operands.
`METADATA_VALUE` represents a `ValueAsMetadata`, and always has two fields: the type and the value.
`METADATA_NODE` represents an `MDNode`, and unlike `METADATA_OLD_NODE`, doesn't store types. It stores operands at their ID+1 so that `0` can reference `nullptr` operands.
Part of PR21532.
llvm-svn: 224073
show more ...
|
#
005f9f43 |
| 11-Dec-2014 |
Duncan P. N. Exon Smith <dexonsmith@apple.com> |
Bitcode: Add `OLD_` prefix to metadata node records
I'm about to change these, so move the old ones out of the way.
Part of PR21532.
llvm-svn: 224070
|
#
5bf8fef5 |
| 09-Dec-2014 |
Duncan P. N. Exon Smith <dexonsmith@apple.com> |
IR: Split Metadata from Value
Split `Metadata` away from the `Value` class hierarchy, as part of PR21532. Assembly and bitcode changes are in the wings, but this is the bulk of the change for the I
IR: Split Metadata from Value
Split `Metadata` away from the `Value` class hierarchy, as part of PR21532. Assembly and bitcode changes are in the wings, but this is the bulk of the change for the IR C++ API.
I have a follow-up patch prepared for `clang`. If this breaks other sub-projects, I apologize in advance :(. Help me compile it on Darwin I'll try to fix it. FWIW, the errors should be easy to fix, so it may be simpler to just fix it yourself.
This breaks the build for all metadata-related code that's out-of-tree. Rest assured the transition is mechanical and the compiler should catch almost all of the problems.
Here's a quick guide for updating your code:
- `Metadata` is the root of a class hierarchy with three main classes: `MDNode`, `MDString`, and `ValueAsMetadata`. It is distinct from the `Value` class hierarchy. It is typeless -- i.e., instances do *not* have a `Type`.
- `MDNode`'s operands are all `Metadata *` (instead of `Value *`).
- `TrackingVH<MDNode>` and `WeakVH` referring to metadata can be replaced with `TrackingMDNodeRef` and `TrackingMDRef`, respectively.
If you're referring solely to resolved `MDNode`s -- post graph construction -- just use `MDNode*`.
- `MDNode` (and the rest of `Metadata`) have only limited support for `replaceAllUsesWith()`.
As long as an `MDNode` is pointing at a forward declaration -- the result of `MDNode::getTemporary()` -- it maintains a side map of its uses and can RAUW itself. Once the forward declarations are fully resolved RAUW support is dropped on the ground. This means that uniquing collisions on changing operands cause nodes to become "distinct". (This already happened fairly commonly, whenever an operand went to null.)
If you're constructing complex (non self-reference) `MDNode` cycles, you need to call `MDNode::resolveCycles()` on each node (or on a top-level node that somehow references all of the nodes). Also, don't do that. Metadata cycles (and the RAUW machinery needed to construct them) are expensive.
- An `MDNode` can only refer to a `Constant` through a bridge called `ConstantAsMetadata` (one of the subclasses of `ValueAsMetadata`).
As a side effect, accessing an operand of an `MDNode` that is known to be, e.g., `ConstantInt`, takes three steps: first, cast from `Metadata` to `ConstantAsMetadata`; second, extract the `Constant`; third, cast down to `ConstantInt`.
The eventual goal is to introduce `MDInt`/`MDFloat`/etc. and have metadata schema owners transition away from using `Constant`s when the type isn't important (and they don't care about referring to `GlobalValue`s).
In the meantime, I've added transitional API to the `mdconst` namespace that matches semantics with the old code, in order to avoid adding the error-prone three-step equivalent to every call site. If your old code was:
MDNode *N = foo(); bar(isa <ConstantInt>(N->getOperand(0))); baz(cast <ConstantInt>(N->getOperand(1))); bak(cast_or_null <ConstantInt>(N->getOperand(2))); bat(dyn_cast <ConstantInt>(N->getOperand(3))); bay(dyn_cast_or_null<ConstantInt>(N->getOperand(4)));
you can trivially match its semantics with:
MDNode *N = foo(); bar(mdconst::hasa <ConstantInt>(N->getOperand(0))); baz(mdconst::extract <ConstantInt>(N->getOperand(1))); bak(mdconst::extract_or_null <ConstantInt>(N->getOperand(2))); bat(mdconst::dyn_extract <ConstantInt>(N->getOperand(3))); bay(mdconst::dyn_extract_or_null<ConstantInt>(N->getOperand(4)));
and when you transition your metadata schema to `MDInt`:
MDNode *N = foo(); bar(isa <MDInt>(N->getOperand(0))); baz(cast <MDInt>(N->getOperand(1))); bak(cast_or_null <MDInt>(N->getOperand(2))); bat(dyn_cast <MDInt>(N->getOperand(3))); bay(dyn_cast_or_null<MDInt>(N->getOperand(4)));
- A `CallInst` -- specifically, intrinsic instructions -- can refer to metadata through a bridge called `MetadataAsValue`. This is a subclass of `Value` where `getType()->isMetadataTy()`.
`MetadataAsValue` is the *only* class that can legally refer to a `LocalAsMetadata`, which is a bridged form of non-`Constant` values like `Argument` and `Instruction`. It can also refer to any other `Metadata` subclass.
(I'll break all your testcases in a follow-up commit, when I propagate this change to assembly.)
llvm-svn: 223802
show more ...
|
Revision tags: llvmorg-3.5.1-rc1 |
|
#
51d2de7b |
| 03-Dec-2014 |
Peter Collingbourne <peter@pcc.me.uk> |
Prologue support
Patch by Ben Gamari!
This redefines the `prefix` attribute introduced previously and introduces a `prologue` attribute. There are a two primary usecases that these attributes aim
Prologue support
Patch by Ben Gamari!
This redefines the `prefix` attribute introduced previously and introduces a `prologue` attribute. There are a two primary usecases that these attributes aim to serve,
1. Function prologue sigils
2. Function hot-patching: Enable the user to insert `nop` operations at the beginning of the function which can later be safely replaced with a call to some instrumentation facility
3. Runtime metadata: Allow a compiler to insert data for use by the runtime during execution. GHC is one example of a compiler that needs this functionality for its tables-next-to-code functionality.
Previously `prefix` served cases (1) and (2) quite well by allowing the user to introduce arbitrary data at the entrypoint but before the function body. Case (3), however, was poorly handled by this approach as it required that prefix data was valid executable code.
Here we redefine the notion of prefix data to instead be data which occurs immediately before the function entrypoint (i.e. the symbol address). Since prefix data now occurs before the function entrypoint, there is no need for the data to be valid code.
The previous notion of prefix data now goes under the name "prologue data" to emphasize its duality with the function epilogue.
The intention here is to handle cases (1) and (2) with prologue data and case (3) with prefix data.
References ----------
This idea arose out of discussions[1] with Reid Kleckner in response to a proposal to introduce the notion of symbol offsets to enable handling of case (3).
[1] http://lists.cs.uiuc.edu/pipermail/llvmdev/2014-May/073235.html
Test Plan: testsuite
Differential Revision: http://reviews.llvm.org/D6454
llvm-svn: 223189
show more ...
|
#
49e9bf8c |
| 17-Nov-2014 |
Rafael Espindola <rafael.espindola@gmail.com> |
Pass a reference to ValueEnumerator.
NFC. This will just make it easier to use std::unique_ptr in a caller.
llvm-svn: 222170
|
#
de36e804 |
| 11-Nov-2014 |
Duncan P. N. Exon Smith <dexonsmith@apple.com> |
Revert "IR: MDNode => Value"
Instead, we're going to separate metadata from the Value hierarchy. See PR21532.
This reverts commit r221375. This reverts commit r221373. This reverts commit r221359.
Revert "IR: MDNode => Value"
Instead, we're going to separate metadata from the Value hierarchy. See PR21532.
This reverts commit r221375. This reverts commit r221373. This reverts commit r221359. This reverts commit r221167. This reverts commit r221027. This reverts commit r221024. This reverts commit r221023. This reverts commit r220995. This reverts commit r220994.
llvm-svn: 221711
show more ...
|
#
3d5a02f6 |
| 03-Nov-2014 |
Duncan P. N. Exon Smith <dexonsmith@apple.com> |
IR: MDNode => Value: Instruction::getAllMetadataOtherThanDebugLoc()
Change `Instruction::getAllMetadataOtherThanDebugLoc()` from a vector of `MDNode` to one of `Value`. Part of PR21433.
llvm-svn:
IR: MDNode => Value: Instruction::getAllMetadataOtherThanDebugLoc()
Change `Instruction::getAllMetadataOtherThanDebugLoc()` from a vector of `MDNode` to one of `Value`. Part of PR21433.
llvm-svn: 221167
show more ...
|
#
60d87e72 |
| 21-Oct-2014 |
Duncan P. N. Exon Smith <dexonsmith@apple.com> |
IR: Remove dead code in metadata bitcode writing, NFC
No one cares how many uses each metadata value has, so don't bother counting.
llvm-svn: 220337
|
#
c00017d1 |
| 15-Oct-2014 |
Sanjay Patel <spatel@rotateright.com> |
correct const-ness with auto and dyn_cast
1. Use const with autos. 2. Don't bother with explicit const in cast ops because they do it automagically.
Thanks, David B. / Aaron B. / Reid K.
llvm-svn:
correct const-ness with auto and dyn_cast
1. Use const with autos. 2. Don't bother with explicit const in cast ops because they do it automagically.
Thanks, David B. / Aaron B. / Reid K.
llvm-svn: 219817
show more ...
|
#
473e7fdb |
| 15-Oct-2014 |
Sanjay Patel <spatel@rotateright.com> |
Use 'auto' for easier reading; no functional change intended.
llvm-svn: 219804
|
Revision tags: llvmorg-3.5.0, llvmorg-3.5.0-rc4, llvmorg-3.5.0-rc3, llvmorg-3.5.0-rc2 |
|
#
1f66c856 |
| 28-Jul-2014 |
Duncan P. N. Exon Smith <dexonsmith@apple.com> |
Bitcode: Serialize (and recover) use-list order
Predict and serialize use-list order in bitcode. This makes the option `-preserve-bc-use-list-order` work *most* of the time, but this is still exper
Bitcode: Serialize (and recover) use-list order
Predict and serialize use-list order in bitcode. This makes the option `-preserve-bc-use-list-order` work *most* of the time, but this is still experimental.
- Builds a full value-table up front in the writer, sets up a list of use-list orders to write out, and discards the table. This is a simpler first step than determining the order from the various overlapping IDs of values on-the-fly.
- The shuffles stored in the use-list order list have an unnecessarily large memory footprint.
- `blockaddress` expressions cause functions to be materialized out-of-order. For now I've ignored this problem, so use-list orders will be wrong for constants used by functions that have block addresses taken. There are a couple of ways to fix this, but I don't have a concrete plan yet.
- When materializing functions lazily, the use-lists for constants will not be correct. This use case is out of scope: what should the use-list order be, if it's incomplete?
This is part of PR5680.
llvm-svn: 214125
show more ...
|
#
6b6fdc99 |
| 25-Jul-2014 |
Duncan P. N. Exon Smith <dexonsmith@apple.com> |
IPO: Add use-list-order verifier
Add a -verify-use-list-order pass, which shuffles use-list order, writes to bitcode, reads back, and verifies that the (shuffled) order matches.
- The utility fun
IPO: Add use-list-order verifier
Add a -verify-use-list-order pass, which shuffles use-list order, writes to bitcode, reads back, and verifies that the (shuffled) order matches.
- The utility functions live in lib/IR/UseListOrder.cpp.
- Moved (and renamed) the command-line option to enable writing use-lists, so that this pass can return early if the use-list orders aren't being serialized.
It's not clear that this pass is the right direction long-term (perhaps a separate tool instead?), but short-term it's a great way to test the use-list order prototype. I've added an XFAIL-ed testcase that I'm hoping to get working pretty quickly.
This is part of PR5680.
llvm-svn: 213945
show more ...
|
Revision tags: llvmorg-3.5.0-rc1 |
|
#
b0407ba0 |
| 18-Jul-2014 |
Hal Finkel <hfinkel@anl.gov> |
Add a dereferenceable attribute
This attribute indicates that the parameter or return pointer is dereferenceable. Practically speaking, loads from such a pointer within the associated byte range are
Add a dereferenceable attribute
This attribute indicates that the parameter or return pointer is dereferenceable. Practically speaking, loads from such a pointer within the associated byte range are safe to speculatively execute. Such pointer parameters are common in source languages (C++ references, for example).
llvm-svn: 213385
show more ...
|
#
e15442c8 |
| 18-Jul-2014 |
Hal Finkel <hfinkel@anl.gov> |
Rename AlignAttribute to IntAttribute
Currently the only kind of integer IR attributes that we have are alignment attributes, and so the attribute kind that takes an integer parameter is called Alig
Rename AlignAttribute to IntAttribute
Currently the only kind of integer IR attributes that we have are alignment attributes, and so the attribute kind that takes an integer parameter is called AlignAttr, but that will change (we'll soon be adding a dereferenceable attribute that also takes an integer value). Accordingly, rename AlignAttribute to IntAttribute (class names, enums, etc.).
No functionality change intended.
llvm-svn: 213352
show more ...
|