summaryrefslogtreecommitdiff
path: root/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
AgeCommit message (Collapse)Author
2022-07-10ManagedStatic: remove many straightforward uses in llvmNicolai Hähnle
Bulk remove many of the more trivial uses of ManagedStatic in the llvm directory, either by defining a new getter function or, in many cases, moving the static variable directly into the only function that uses it. Differential Revision: https://reviews.llvm.org/D129120
2022-07-06[LLVM] Add the support for fmax and fmin in atomicrmw instructionShilei Tian
This patch adds the support for `fmax` and `fmin` operations in `atomicrmw` instruction. For now (at least in this patch), the instruction will be expanded to CAS loop. There are already a couple of targets supporting the feature. I'll create another patch(es) to enable them accordingly. Reviewed By: arsenm Differential Revision: https://reviews.llvm.org/D127041
2022-07-06[ConstExpr] Remove div/rem constant expressionsNikita Popov
D128820 stopped creating div/rem constant expressions by default; this patch removes support for them entirely. The getUDiv(), getExactUDiv(), getSDiv(), getExactSDiv(), getURem() and getSRem() on ConstantExpr are removed, and ConstantExpr::get() now only accepts binary operators for which ConstantExpr::isSupportedBinOp() returns true. Uses of these methods may be replaced either by corresponding IRBuilder methods, or ConstantFoldBinaryOpOperands (if a constant result is required). On the C API side, LLVMConstUDiv, LLVMConstExactUDiv, LLVMConstSDiv, LLVMConstExactSDiv, LLVMConstURem and LLVMConstSRem are removed and corresponding LLVMBuild methods should be used. Importantly, this also means that constant expressions can no longer trap! This patch still keeps the canTrap() method to minimize diff -- I plan to drop it in a separate NFC patch. Differential Revision: https://reviews.llvm.org/D129148
2022-06-29Use value_or instead of getValueOr. NFCFangrui Song
2022-06-29[Bitcode] Restore bitcast expression auto-upgradeNikita Popov
Restore the autoupgrade from bitcast to ptrtoint+inttoptr, which was lost as part of D127729. This fixes the backwards compatibility issue noted in: https://reviews.llvm.org/D127729#inline-1236519
2022-06-28[Bitcode] Support expanding constant expressions into instructionsNikita Popov
This implements an autoupgrade from constant expressions to instructions, which is needed for https://discourse.llvm.org/t/rfc-remove-most-constant-expressions/63179. The basic approach is that constant expressions (CST_CODE_CE_* records) now initially only create a BitcodeConstant value that holds opcode, flags and operands IDs. Then, when the value actually gets used, it can be converted either into a constant expression (if that expression type is still supported) or into a sequence of instructions. As currently all expressions are still supported, -expand-constant-exprs is added for testing purposes, to force expansion. PHI nodes require special handling, because the constant expression needs to be evaluated on the incoming edge. We do this by putting it into a temporary block and then wiring it up appropriately afterwards (for non-critical edges, we could also move the instructions into the predecessor). This also removes the need for the forward referenced constants machinery, as the BitcodeConstants only hold value IDs. At the point where the value is actually materialized, no forward references are needed anymore. Differential Revision: https://reviews.llvm.org/D127729
2022-06-20[llvm] Don't use Optional::getValue (NFC)Kazu Hirata
2022-06-15[BitcodeReader] Remove unnecessary argument defaults (NFC)Nikita Popov
This is an internal method that is always called with all arguments.
2022-06-14[Coroutines] Convert coroutine.presplit to enum attrChuanqi Xu
This is required by @nikic in https://reviews.llvm.org/D127383 to decrease the cost to check whether a function is a coroutine and this fixes a FIXME too. Reviewed By: rjmccall, ezhulenev Differential Revision: https://reviews.llvm.org/D127471
2022-06-10[Bitcode] Don't use UINT_MAX for missing SanitizerMetadataVitaly Buka
Looks like comment on D126100 was unnoticed.
2022-06-10Add sanitizer-specific GlobalValue attributes.Mitch Phillips
Plan is the migrate the global variable metadata for sanitizers, that's currently carried around generally in the 'llvm.asan.globals' section, onto the global variable itself. This patch adds the attribute and plumbs it through the LLVM IR and bitcode formats, but is a no-op other than that so far. Reviewed By: vitalybuka, kstoimenov Differential Revision: https://reviews.llvm.org/D126100
2022-05-31attributes: introduce allockind attr for describing allocator fn behaviorAugie Fackler
I chose to encode the allockind information in a string constant because otherwise we would get a bit of an explosion of keywords to deal with the possible permutations of allocation function types. I'm not sure that CodeGen.h is the correct place for this enum, but it seemed to kind of match the UWTableKind enum so I put it in the same place. Constructive suggestions on a better location most certainly encouraged. Differential Revision: https://reviews.llvm.org/D123088
2022-05-20[ObjCARC] Drop nullary clang.arc.attachedcall bundles in autoupgrade.Ahmed Bougacha
In certain use-cases, these can be emitted by old compilers, but the operand is now always required. These are only used for optimizations, so it's safe to drop them if they happen to have the now-invalid format. The semantically-required call is already a separate instruction. Differential Revision: https://reviews.llvm.org/D123811
2022-05-17[OpaquePtr][BitcodeReader] Explicitly turn off opaque pointers if we see a ↵Arthur Eubanks
typed pointer Followup to D125735 on the bitcode reader side. Reviewed By: #opaque-pointers, nikic Differential Revision: https://reviews.llvm.org/D125736
2022-04-26Attributes: add a new `allocptr` attributeAugie Fackler
This continues the push away from hard-coded knowledge about functions towards attributes. We'll use this to annotate free(), realloc() and cousins and obviate the hard-coded list of free functions. Differential Revision: https://reviews.llvm.org/D123083
2022-04-12[Bitcode] materialize Functions early when BlockAddress takenNick Desaulniers
IRLinker builds a work list of functions to materialize, then moves them from a source module to a destination module one at a time. This is a problem for blockaddress Constants, since they need not refer to the function they are used in; IPSCCP is quite good at sinking these constants deep into other functions when passed as arguments. This would lead to curious errors during LTO: ld.lld: error: Never resolved function from blockaddress ... based on the ordering of function definitions in IR. The problem was that IRLinker would basically do: for function f in worklist: materialize f splice f from source module to destination module in one pass, with Functions being lazily added to the running worklist. This confuses BitcodeReader, which cannot disambiguate whether a blockaddress is referring to a function which has not yet been parsed ("materialized") or is simply empty because its body was spliced out. This causes BitcodeReader to insert Functions into its BasicBlockFwdRefs list incorrectly, as it will never re-materialize an already materialized (but spliced out) function. Because of the possibility that blockaddress Constants may appear in Functions other than the ones they reference, this patch adds a new bitcode function code FUNC_CODE_BLOCKADDR_USERS that is a simple list of Functions that contain BlockAddress Constants that refer back to this Function, rather then the Function they are scoped in. We then materialize those functions when materializing `f` from the example loop above. This might over-materialize Functions should the user of BitcodeReader ultimately decide not to link those Functions, but we can at least now we can avoid this ordering related issue with blockaddresses. Fixes: https://github.com/llvm/llvm-project/issues/52787 Fixes: https://github.com/ClangBuiltLinux/linux/issues/1215 Reviewed By: dexonsmith Differential Revision: https://reviews.llvm.org/D120781
2022-04-05[LLVMContext] Replace enableOpaquePointers() with setOpaquePointers()Nikita Popov
This allows both explicitly enabling and explicitly disabling opaque pointers, in anticipation of the default switching at some point. This also slightly changes the rules by allowing calls if either the opaque pointer mode has not yet been set (explicitly or implicitly) or if the value remains unchanged.
2022-03-21Revert "Revert "[OpaquePointers][BitcodeReader] Enable -opaque-pointers if ↵Arthur Eubanks
we see an opaque pointer type"" This reverts commit 80ec0ebfdc5692a58e0832125f2c6a991df9d63f. Issues were already fixed at head.
2022-03-21Revert "[OpaquePointers][BitcodeReader] Enable -opaque-pointers if we see an ↵Mitch Phillips
opaque pointer type" This reverts commit 46216aa97729aa994dce79e75cd25707fb4b7874. Dependency https://reviews.llvm.org/D119482 broke the ASan buildbot.
2022-03-21[OpaquePointers][BitcodeReader] Enable -opaque-pointers if we see an opaque ↵Arthur Eubanks
pointer type This allows us to more easily test opaque pointers e.g. in the case of ThinLTO where we only have to pass -opaque-pointers to the frontend. Reviewed By: #opaque-pointers, nikic Differential Revision: https://reviews.llvm.org/D122048
2022-03-16[OpaquePtr][ARM] Use elementtype on ldrex/ldaex/stlex/strexArthur Eubanks
Includes verifier changes checking the elementtype, clang codegen changes to emit the elementtype, and ISel changes using the elementtype. Basically the same as D120527. Reviewed By: #opaque-pointers, nikic Differential Revision: https://reviews.llvm.org/D121847
2022-03-14[OpaquePtr][AArch64] Use elementtype on ldxr/stxrArthur Eubanks
Includes verifier changes checking the elementtype, clang codegen changes to emit the elementtype, and ISel changes using the elementtype. Reviewed By: #opaque-pointers, nikic Differential Revision: https://reviews.llvm.org/D120527
2022-03-11[Bitcode] Don't confuse type attributes on declaration and callNikita Popov
We should not be using APIs here that try to fetch the attribute from both the call attributes and the function attributes. Otherwise we'll try to upgrade a non-existent sret attribute on the call using the attribute on the function.
2022-03-11[Bitcode] Encode alloca address spaceNikita Popov
Since D101045, allocas are no longer required to be part of the default alloca address space. There may be allocas in multiple different address spaces. However, the bitcode reader would simply assume the default alloca address space, resulting in either an error or incorrect IR. Add an optional record for allocas which encodes the address space.
2022-03-11[Bitcode] Check for type mismatch when assigning valueNikita Popov
If the value is forward-declared, then the type must match, otherwise we can't RAUW.
2022-03-11[Bitcode] Delete phi node on errorNikita Popov
These error conditions are checked after the phi node has been created, so we also need to delete it.
2022-03-11[Bitcode] Improve some error messagesNikita Popov
It's not particularly helpful if 95% of our errors just say "Invalid record". This at least adds the record type to a subset of errors.
2022-03-11[Bitcode] Delete instruction on errorNikita Popov
As these errors are detected after the instruction has already been created (but before it has been inserted into the function), we also need to delete it.
2022-03-11[Bitcode] Report error for missing element type for attr upgradeNikita Popov
Otherwise this is going to crash either the TypeFinder or the Verifier.
2022-03-10[BitcodeReader] Support GEP without indicesNikita Popov
LLVM considers these to be legal, so make sure the bitcode reader can read them. I broke this when implementing opaque pointer auto upgrade support.
2022-03-04Attributes: add a new allocalign attributeAugie Fackler
This will let us start moving away from hard-coded attributes in MemoryBuiltins.cpp and put the knowledge about various attribute functions in the compilers that emit those calls where it probably belongs. Differential Revision: https://reviews.llvm.org/D117921
2022-03-04[Bitcode] Move x86_intrcc upgrade to bitcode readerNikita Popov
This upgrade requires access the legacy pointer element type, so it needs to happen inside the bitcode reader.
2022-03-04[Bitcode] Fully support opaque pointer auto upgradeNikita Popov
This completes the propagation of type IDs through bitcode reading, and switches remaining uses of getPointerElementType() to use contained type IDs. The main new thing here is that sometimes we need to create a type ID for a type that was not explicitly encoded in bitcode (or we don't know its ID at the current point). For such types we create a "virtual" type ID, which is cached based on the type and the contained type IDs. Luckily, we generally only need zero or one contained type IDs, and in the one case where we need two, we can get away with not including it in the cache key. With this change, we pass the entirety of llvm-test-suite at O3 with opaque pointers. Differential Revision: https://reviews.llvm.org/D120471
2022-03-01[SanitizerBounds] Add support for NoSanitizeBounds functionTong Zhang
Currently adding attribute no_sanitize("bounds") isn't disabling -fsanitize=local-bounds (also enabled in -fsanitize=bounds). The Clang frontend handles fsanitize=array-bounds which can already be disabled by no_sanitize("bounds"). However, instrumentation added by the BoundsChecking pass in the middle-end cannot be disabled by the attribute. The fix is very similar to D102772 that added the ability to selectively disable sanitizer pass on certain functions. In this patch, if no_sanitize("bounds") is provided, an additional function attribute (NoSanitizeBounds) is attached to IR to let the BoundsChecking pass know we want to disable local-bounds checking. In order to support this feature, the IR is extended (similar to D102772) to make Clang able to preserve the information and let BoundsChecking pass know bounds checking is disabled for certain function. Reviewed By: melver Differential Revision: https://reviews.llvm.org/D119816
2022-02-25[IR] Use CallBase::getParamElementType() (NFC)Nikita Popov
As this method now exists on CallBase, use it rather than the one on AttributeList.
2022-02-23[Bitcode] Store function type IDs rather than function typesNikita Popov
This resolves one of the type ID propagation TODOs.
2022-02-22[Bitcode] Store type IDs for valuesNikita Popov
This is the next step towards supporting bitcode auto upgrade with opaque pointers. The ValueList now stores the Value* together with its associated type ID, which allows inspecting the original pointer element type of arbitrary values. This is a largely mechanical change threading the type ID through various places. I've left TODOTypeID placeholders in a number of places where determining the type ID is either non-trivial or requires allocating a new type ID not present in the original bitcode. For this reason, the new type IDs are also not used for anything yet (apart from propagation). They will get used once the TODOs are resolved. Differential Revision: https://reviews.llvm.org/D119821
2022-02-15[BitcodeReader] Change order of assignValue() arguments (NFC)Nikita Popov
Other methods in ValueList generally pass Idx first, and it is more convention for assignment methods to have the target on the LHS rather than RHS.
2022-02-15[Bitcode] Improve support for opaque-pointer bitcode upgradeNikita Popov
This is step two of supporting autoupgrade of old bitcode to opaque pointers. Rather than tracking the element type ID of pointers in particular, track all type IDs that a type contains. This allows us to recover the element type in more complex situations, e.g. when we need to determine the pointer element type of a vector element or function type parameter. Differential Revision: https://reviews.llvm.org/D119339
2022-02-14[BitcodeReader] Fix use-after-moveFangrui Song
2022-02-14Extend the `uwtable` attribute with unwind table kindMomchil Velikov
We have the `clang -cc1` command-line option `-funwind-tables=1|2` and the codegen option `VALUE_CODEGENOPT(UnwindTables, 2, 0) ///< Unwind tables (1) or asynchronous unwind tables (2)`. However, this is encoded in LLVM IR by the presence or the absence of the `uwtable` attribute, i.e. we lose the information whether to generate want just some unwind tables or asynchronous unwind tables. Asynchronous unwind tables take more space in the runtime image, I'd estimate something like 80-90% more, as the difference is adding roughly the same number of CFI directives as for prologues, only a bit simpler (e.g. `.cfi_offset reg, off` vs. `.cfi_restore reg`). Or even more, if you consider tail duplication of epilogue blocks. Asynchronous unwind tables could also restrict code generation to having only a finite number of frame pointer adjustments (an example of *not* having a finite number of `SP` adjustments is on AArch64 when untagging the stack (MTE) in some cases the compiler can modify `SP` in a loop). Having the CFI precise up to an instruction generally also means one cannot bundle together CFI instructions once the prologue is done, they need to be interspersed with ordinary instructions, which means extra `DW_CFA_advance_loc` commands, further increasing the unwind tables size. That is to say, async unwind tables impose a non-negligible overhead, yet for the most common use cases (like C++ exceptions), they are not even needed. This patch extends the `uwtable` attribute with an optional value: - `uwtable` (default to `async`) - `uwtable(sync)`, synchronous unwind tables - `uwtable(async)`, asynchronous (instruction precise) unwind tables Reviewed By: MaskRay Differential Revision: https://reviews.llvm.org/D114543
2022-02-14[BitcodeReader] Rename method for element type by ID (NFC)Nikita Popov
Make it clearer that this method is specifically for pointer element types, and not other element types. This distinction will be relevant in the future. The somewhat unusual spelling is to make sure this does not show up when grepping for getPointerElementType.
2022-02-11[Bitcode] Add partial support for opaque pointer auto-upgradeNikita Popov
Auto-upgrades that rely on the pointer element type do not work in opaque pointer mode. The idea behind this patch is that we can instead work with type IDs, for which we can retain the pointer element type. For typed pointer bitcode, we will have a distinct type ID for pointers with distinct element type, even if there will only be a single corresponding opaque pointer type. The disclaimer here is that this is only the first step of the change, and there are still more getPointerElementType() calls to remove. I expect that two more patches will be needed: 1. Track all "contained" type IDs, which will allow us to handle function params (which are contained in the function type) and GEPs (which may use vectors of pointers) 2. Track type IDs for values, which is e.g. necessary to handle loads. Differential Revision: https://reviews.llvm.org/D118694
2022-02-09[Bitcode] Check minimum size of constant GEP recordNikita Popov
Checking this early, because we may end up reading up to two records before the operands.
2022-02-08[Bitcode] Prevent OOB read for invalid name sizeNikita Popov
2022-02-07[Bitcode] Replace assertion with checkNikita Popov
2022-02-07[Bitcode] Handle invalid data layout gracefullyNikita Popov
2022-02-07[Bitcode] Guard against out of bounds value referenceNikita Popov
We should make sure that the value ID is in bounds, otherwise we will assert / read out of bounds.
2022-02-07[Bitcode] Don't assert on invalid attribute group recordNikita Popov
Report an error instead.
2022-02-04[BitcodeReader] Resolve error handling todoNikita Popov
If possible, forward the inner error instead of creating a new one.