Commit Graph

2399 Commits

Author SHA1 Message Date
Kacper Kołodziej 6e56fedc80 Prefer String.empty() case first 2023-03-29 16:37:34 +02:00
Kacper Kołodziej c0781ae4c2 Compare to nullptr instead of implicit cast
Prefer explicit comparing to nullptr instead of implicit casting pointer
to bool.
2023-03-29 16:37:34 +02:00
Kacper Kołodziej 23c8c199a1 Rename getStrByAddress to getStringByAddress
We don't use abbreviations in names.
2023-03-29 16:37:34 +02:00
Pietro Fezzardi 19e937c9bf Support empty strings in getUniqueString
This commit works around a quirk of
`llvm::ConstantDataArray::getString`, which returns a
`llvm::ConstantAggregateZero` for empty strings.

This quirk caused assertions in the previous implementation when passing
an empty `String` to `getUniqueString`.
2023-03-29 16:37:34 +02:00
Pietro Fezzardi e294be2424 Assert non-empty namespace in getUniqueString
Using an empty namespace causes the creation of a named metadata with an
empty string as name.
`llvm::verifyModule` does not check for that, so the `Module` still
verifies, but the on-disk serialization generated by `AsmPrinter.cpp`
prints `"empty name"` instead of the metadata name, and if the
serialized `Module` is then reparsed it parses succesfully but it does
not verify anymore.
2023-03-29 16:37:34 +02:00
Pietro Fezzardi 43297efad0 Fix attributes of build_PlainMetaAddress function
These allow it to be DCE'd and CSE'd if possible directly by LLVM
instead of requiring us to handle it esplicitly as a special case.
2023-03-29 16:37:34 +02:00
Pietro Fezzardi 022aeb0df3 RawBinaryView: add getStrByAddress method
This method is similar to `getByAddress`, but it returns an
`llvm::StringRef`.

It is intended for those users that need to manipulate the bytes as
strings. In those cases, the `llvm::ArrayRef<uint8_t>` returned by
`getByAddress` is not suitable, because it triggers warnings due to
`uint8_t` not being the same as `char`.
2023-03-29 16:37:34 +02:00
Kacper Kołodziej b36bd3bd6c Add RawBinaryView::isReadOnly method
isReadOnly returns true if segment which contains region defined with
 MetaAddress and size is not writable.
2023-03-29 16:37:34 +02:00
Kacper Kołodziej 2cfcb3c1f5 Add --binary argument to llvm_pipeline.py 2023-03-29 16:37:34 +02:00
Alessandro Di Federico b866e9010e ELFImporter: fix setting gp_mips canonical value
We used to set the canonical value of the MIPS gp register even in
absence of PLT, leading to a crash (specifically on archlinux librt.so).
2023-03-22 14:22:24 +01:00
Djordje Todorovic 956160e667 TypeCopier: Avoid copying the types twice 2023-03-22 11:38:12 +01:00
Alessandro Di Federico 2fdfaef77e Merge branch 'feature/fix-rename' 2023-03-20 16:38:11 +01:00
Giacomo Vercesi c7d13fd176 PipelineC: fix model verification clause
In the previous implementation of Model.verify an llvm::Error was
returned. Some call sites retained the logic associated with it. Fix
these with the correct logic.
Also fix an instance of `verify` that was missing an assert.
2023-03-20 16:20:06 +01:00
Giacomo Vercesi 3b94dfae4b PipelineC: rework rp_error data type
Drop the use of unique_ptr within the rp_error data type and instead use
std::monostate. Also fix the functions to allow the use of `nullptr` as
the error parameter
2023-03-20 16:08:04 +01:00
Alessandro Di Federico 92dd38c603 TypeCopier: copy PrimitiveTypes only when needed 2023-03-16 15:39:55 +01:00
Alessandro Di Federico d24a8ff120 Merge branch 'feature/stack-argument-alignment' 2023-03-15 14:07:47 +01:00
Ivan Krysak 9475eefe76 ABI-testing: add unit tests for the alignment 2023-03-15 10:19:03 +01:00
Ivan Krysak 64856306c4 BinaryImporter: rework command line interface 2023-03-15 10:19:03 +01:00
Ivan Krysak 35956f46fe DwarfImporter: leave a note about static functions 2023-03-15 10:19:03 +01:00
Ivan Krysak 19e292f097 abi::FunctionType: standardize std integer usage
This reevaluates the places where `std::size_t` should be replaced by
`std::uint64_t` in the conversions, it also appends `std::` prefixes to
them where it's possible in preparation to the eventual `import std`
transition.
2023-03-15 10:19:03 +01:00
Ivan Krysak 7c360eb8d1 PDBImporter: preserve x64 vector and clr ABIs 2023-03-15 10:19:03 +01:00
Ivan Krysak 34b532c754 BinaryImporter: always promote original name 2023-03-15 10:19:03 +01:00
Ivan Krysak 08b3764b23 BinaryImporter: prevent overlap in segment struct 2023-03-15 10:19:03 +01:00
Ivan Krysak 1f439cbb8c ABI-testing: extend to support unusual alignment
Because it's often hard to predict the specific location of an argument when
non-natural alignment is concerned, this adds an extra check allowing
the cases to pass if they would be well-formed if only some pesky
"extra" bytes were to disappear.
2023-03-15 10:19:03 +01:00
Ivan Krysak 750b6361a8 ABI-testing: add SPTARV support 2023-03-15 10:19:03 +01:00
Ivan Krysak d65ed50e0b ABI-testing: allow explicit abi overrides
Since dwarf sometimes misdetects abi pretty badly, to maintain
the usefulness of the test, it's beneficial to sometimes discard
the "detected" ABI by overriding it by the known value.

This also add a check ensuring that all the functions presents in
the artifact are also present in the binary.
2023-03-15 10:19:03 +01:00
Ivan Krysak a7be2cd11b ABI-testing: improve robustness against padding
Some cases of irregular padding were causing issues when verifying
arguments which varanted a bit of the rework of the main verification
loop.
2023-03-15 10:19:03 +01:00
Ivan Krysak e1ebe8ea35 ABI-testing: introduce CABI-FT correction script 2023-03-15 10:19:03 +01:00
Ivan Krysak a360b11426 ABI: fix issues with regparm abi definitions 2023-03-15 10:19:03 +01:00
Ivan Krysak 1f27e938bf ABI: rework non-position based distribution
The original non-position based distribution (`considerRegisters`)
algorithm had a whole lot of problems preventing effective padding
support because it was written with only registers in mind.

As such, it was easier to rewrite the whole logic from scratch over
trying to fix it incrementally.
2023-03-15 10:19:03 +01:00
Ivan Krysak e84c76019a ABI: introduce an additional definition option
The new option is `NoRegisterArgumentsCanComeAfterStackOnes`
If it's set to `true`, then no register argument can follow any stack
argument under the said abi, otherwise such "shuffling" of arguments
is allowed.
2023-03-15 10:19:03 +01:00
Ivan Krysak b8b1a716ed ABI: let NoOrDead painlessly decay to No 2023-03-15 10:19:03 +01:00
Ivan Krysak 550b286a9e ABI: stop treating stack pointer as callee saved 2023-03-15 10:19:03 +01:00
Ivan Krysak 15f8999fce ABI-testing: simplify compatibility checker
The complicated error handling logic turned out to be more of
a nuisance than a useful debugging tool. This commit removes it
in favour of `revng_abort`'ing or `revng_check`'ing to make sure
the actual state is consistent with the expectations.

It also adds namespace to `std::size_t` mentions.
2023-03-15 10:19:03 +01:00
Ivan Krysak 2dfe65f65c ABI: purge unnamed types when analyses are done 2023-03-15 10:19:03 +01:00
Ivan Krysak 17c128c59b Make ABI depend on ModelPasses
Before now the dependency was the other way around
2023-03-15 10:19:03 +01:00
Ivan Krysak 4d21a88777 Model: remove an obsolete function conversion pass 2023-03-15 10:19:03 +01:00
Ivan Krysak f068bcb34f ABI-testing: switch to the new analyses 2023-03-15 10:19:03 +01:00
Ivan Krysak 158272dee5 ABI: add an analysis for ToCABI conversion 2023-03-15 10:19:03 +01:00
Ivan Krysak 952b938598 ABI: add an analysis for ToRaw conversion 2023-03-15 10:19:03 +01:00
Ivan Krysak fba30712cc ABI: introduce abi::FunctionType::filterTypes 2023-03-15 10:19:03 +01:00
Ivan Krysak 3d05439001 ABI: improve multi-aligned stack argument support 2023-03-15 10:19:03 +01:00
Ivan Krysak 3edfaa827f ABI: preserve big scalar return values if possible 2023-03-15 10:19:03 +01:00
Ivan Krysak a936990c77 ABI: abstract stack alignment verification away 2023-03-15 10:19:03 +01:00
Ivan Krysak 806d4053a0 ABI: reintroduce conversion logs 2023-03-15 10:19:03 +01:00
Ivan Krysak 09f1d5b5e7 ABI: rework stack argument conversion 2023-03-15 10:19:03 +01:00
Ivan Krysak ea6148e616 DetectABI: leave a todo on droping RS deductions 2023-03-15 10:19:03 +01:00
Ivan Krysak a0adafeab0 ABI: take advantage of register state deductions
This makes the conversions more robust, since everything can rely on
the same tools for filling in missing registers and ordering them based
on the ABI requirements.
2023-03-15 10:19:03 +01:00
Ivan Krysak 0c82ff91b1 ABI: move the conversion ouside the helper class
This will allow reusing the helper class as the type manager.
2023-03-15 10:19:03 +01:00
Ivan Krysak 3422a9bf0f ABI: reintoduce conversion logs 2023-03-15 10:19:03 +01:00