Commit Graph

1407 Commits

Author SHA1 Message Date
Pietro Fezzardi 53c39d32f2 DecompileFunction.cpp: drop support for allocas
Since when we added the -exit-ssa pass, allocas are never supposed to
reach the C backend anymore.
This commit drops the code that supports them, that was effectively dead
code since a quite long time.
2023-04-04 09:33:22 +02:00
Pietro Fezzardi f2134c2966 Merge branch 'feature/cstring-literals' 2023-04-04 09:31:50 +02:00
Pietro Fezzardi fe7df1ae75 Add -Wno-pointer-sign to compile-flags.cfg
Now that we support C string literals, by the rules of the language they
have type `const char [N]` where `N` is a compile time constant.
They also decay to `const char *`.

This causes the `-Wpointer-sign` warning to trigger when recompiling
decompiled C code, since we assign the string literals (with type `const
char *` in C) to variables with other pointer types, some of which are
e.g. `const uint8_t * but possibly also `const generic8_t *`.

Given that we emit C code from assembly this warning is too strict to be
always enforced.
In fact, we had already disabled a similar warnings, such as
`-Wincompatible-pointer-types`, and others.
So we disable `-Wpointer-sign` as well in recompilation tests.
2023-04-04 09:31:10 +02:00
Kacper Kołodziej daead39e60 Check signedness of char in revng-primitive-types.h 2023-04-04 09:31:10 +02:00
Kacper Kołodziej 3038dd179f Add binary to MakeSegmentRefs containers in pipeline
Additional argument (--binary) in some tests is needed, because
MakeSegmentRefPipe requires access to binary file.
2023-04-04 09:31:10 +02:00
Kacper Kołodziej 9decc1fe51 DLA Frontend: Create nodes for StringLiterals
For segmentRef type of the segment and type returned by segmentRef
function are the same.

For cstringLiteral every call returns pointer to 1-byte type. Pointer is
offsetted by value of strlen+1. strlen is fetched from metadata.

Additionally, all uses of cstringLiteral function has same type as the
type of cstringLiteral (pointer to 1-byte).
2023-04-04 09:31:10 +02:00
Kacper Kołodziej 3776c9a382 Add case for StringLiteral in getExpectedModelType
Use Signed instead of Generic Int8 for StringLiteral return type
2023-04-04 09:31:10 +02:00
Kacper Kołodziej 3dd647cb28 Handle StringLiteral tag in InitModelTypes
InitModelTypes: use argument type as return type for cstringLiteral
2023-04-04 09:31:10 +02:00
Kacper Kołodziej c61c59c474 Handle StringLiteral tag in DecompileFunction 2023-04-04 09:31:10 +02:00
Kacper Kołodziej 2445c5e740 MakeSegmentRefPass: emit cstringLiteral
This commit changes MakeSegmentRefPass so that it's now a ModulePass and
it uses the binary to detect integer constants that represent the
address of strings.
When it detects address of constant strings, instead of injecting calls
to SegmentRef, we now inject calls to cstringLiteral, so that we can
later emit them as inline string literals in C.

In segmentRef we use integer type meaning address in memory, so we
generate segmentRef function with non-pointer type. For cstringLiteral
function we need real pointer type of operand.

Save MetaAddress, size, offset and original type for every
cstringLiteral call in metadata as we do for segmentRef calls.

For cstringLiteral "revng.cstring_literal" metadata name is used.

StringLiteralPool needs tuple of address, size, offset and type to
keep distinct string decorator functions for each string. This tuple is
represented by StringLiteralPoolKey struct.

Pipe for MakeSegmentRefPass needs to be defined explicitly, because
additional wrapper passes are required in MakeSegmentRef:

 1. LoadModelWrapperPass
 2. LoadBinaryWrapperPass

MakeSegmentRefPass requires access to RawBinaryView to detect cstring
literals in binary.

Fix printed command in MakeSegmentRefPipe

This printed command might not work. @ale commented it will be replaced
with `revng pipe run-pipe` once we will have it.

Update IRHelpers to new revng API

Switch String and Namespace arguments in getUniqueString
2023-04-04 09:31:10 +02:00
Kacper Kołodziej f83cb94e1f Add StringLiteral tag and corresponding f. pool
StringLiteral tag will be used to mark cstring decorators in generated
IR.
2023-04-04 09:31:10 +02:00
Massimo Fioravanti d9bbe33316 Add initial autoanalysis 2023-03-22 17:25:05 +01:00
Pietro Fezzardi 5d4cbbbda3 Merge branch 'feature/stack-argument-alignment' 2023-03-15 14:49:11 +01:00
Ivan Krysak e52a07a657 revng-primitive-types.h: fix a typo 2023-03-15 10:28:24 +01:00
Ivan Krysak 47213e1669 Backend: remove an obsolete log file 2023-03-15 10:28:24 +01:00
Alessandro Di Federico b0024a302f Fixes for SPTAR passed on the stack 2023-03-15 10:28:24 +01:00
Ivan Krysak f5c50da449 Tests: reorder the analyses to import first
The primitives were imported before the importing of the binary, which
is not valid anymore since it leads to duplicate types in cases where
the binary contains any primitive types, since one of the revng-side
commit now asserts on an attempt to insert multiples of the same type.

Also, this removes a duplicated type from the `SegregateStackAccesses`
test's `override` model.
2023-03-15 10:28:24 +01:00
Ivan Krysak 4e2159d9b5 MakeModelGEP: fix aggregate return value support 2023-03-15 10:28:24 +01:00
Ivan Krysak d08c9387d2 DLA: stop updating aggregate return value types 2023-03-15 10:28:24 +01:00
Ivan Krysak eb34c2ee1f Pipes: add ConvertToCABIFunctionType analysis 2023-03-15 10:28:24 +01:00
Ivan Krysak 89774a1789 RemoveStackAlignmentPass: Add empty input support 2023-03-15 10:28:24 +01:00
Ivan Krysak 64d83c89c4 Testing: use the new temp file generator 2023-03-15 10:28:24 +01:00
Alessandro Di Federico d325e3b64a SSA: support shadow arguments on stack 2023-03-15 10:28:24 +01:00
Ivan Krysak 85fcd92f0e Backend: reword a comment 2023-03-15 10:28:24 +01:00
Ivan Krysak 56cdd8f876 Model: make model::Type::size() stricter 2023-03-15 10:28:24 +01:00
Ivan Krysak c2f0fc19e5 ABI: FunctionType.h -> FunctionType/Layout.h 2023-03-15 10:28:24 +01:00
Pietro Fezzardi 40cf837713 Merge branch 'feature/fix-llvm-linking' 2023-03-15 07:55:08 +01:00
Alessandro Di Federico 77ea6c6db6 Fix serialization of Segment key 2023-03-13 13:42:33 +01:00
Alessandro Di Federico 9be304ece2 areMemOpCompatible: drop redundant check 2023-03-13 13:42:33 +01:00
Alessandro Di Federico e73bd95493 Improve handling of declarations
SegregateStackAccesses and PromoteStackPointer were not handling
functions declarated (but not defined) properly.

This commit fixes this, in part by adopting `TaggedFunctionPass`.
2023-03-13 13:42:33 +01:00
Alessandro Di Federico f6cdd8ad6d s/revng.register/revng.abi_register/ 2023-03-13 13:42:33 +01:00
Alessandro Di Federico f5a5990a30 Drop buildStringPtr in favor of getUniqueString 2023-03-13 13:42:33 +01:00
Djordje Todorovic 5482083e79 DecompileFunction.cpp: print debug info in PTML 2023-03-08 09:57:48 +01:00
Pietro Fezzardi f3e466c989 DecompileFunction.cpp: fix format for int literals 2023-03-01 12:22:35 +01:00
Pietro Fezzardi 599cad1359 Merge branch 'feature/fixes-for-hostname' 2023-02-23 12:55:43 +01:00
Alessandro Di Federico deddd8ebd1 PromoteInitCSVToUndef: only preserved registers
Do not promote registers to `undef` initializers of registers not marked
as being preserved by the current function.

This is useful to highlight usages of registers that are not an
argument, nor a callee saved register. Mainly this has been introduced
to preserved reads from x86-64 `fs` register.
2023-02-21 16:48:35 +01:00
Alessandro Di Federico dfb18bd1cf RemoveLiftingArtifacts: drop makeInitRegsUndef
Redundant w.r.t. PromoteInitCSVToUndef.
2023-02-21 16:48:35 +01:00
Alessandro Di Federico 098b9b3aa4 PromoteStackPointer: prevent DCE of init_local_sp
We need to prevent DCE from killing `revng_init_local_sp`, since certain
passes downstream might want to introduce new uses of it, and they might
be the first.

`SegregateStackAccesses` will take care of removing it by hand.
2023-02-21 16:48:35 +01:00
Alessandro Di Federico e9b9ba50d1 MakeModelGEP: ignore negative strides 2023-02-21 16:48:35 +01:00
Alessandro Di Federico c18dca0031 Adopt new approach for MetaAddress serialization 2023-02-21 16:48:35 +01:00
Pietro Fezzardi 7edfffbbf8 DuplicateReferences: fix for chains of IsRef ops
The previous implementation was iterating on the instructions in order.
This caused problems when we had two instructions, A and B, both tagged
IsRef, and B was using A and B had 2 or more uses.
In this case the pass was looking at A before looking at B, so A was not
duplicated because it only had one use (B).
Then B was analyzed and it had 2 uses so it was duplicated, causing the
number of uses of A to increase accordingly.

This commit fixes the problem iterating on the BasicBlocks in post
order, and on the instruction list in reverse order.

It also fixes MarkAssignments.cpp not to erroneously mark instructions
that are marked IsRef.
2023-02-08 18:12:53 +01:00
Pietro Fezzardi 66434db5f9 Don't use named metadata revng.segment_ref
Using a named metadata is simply wrong, because we need to have many of
these metadata alive at the same time with different values.
Using a named metadata has the unpleasant side effect of making all the
`SegmentRef` functions to refer to the same segment.
2023-02-07 18:03:34 +01:00
Kacper Kołodziej 5b94a5a649 HelpersToHeaders: skip unnecessary helpers 2023-02-07 17:43:05 +01:00
Pietro Fezzardi 72b32dafa2 MakeModelGEP: array accesses jumping many elements
Before this commit we couldn't handle gracefully situations where the
model had an array with elements of given size X and the IR had strided
accesses with a stride Y that was larger than X.

This commit gracefully handles that case, but for now it always bail
out.

In the future we could think of handling this better if Y is a multiple
of X.
2023-02-07 08:12:42 +01:00
Andrea Gussoni 26a717a4ac Compute weight for untangle regions once
Compute the weight of collpased regions the first time it is requested
and cache it, and use the cached value for all successive queries.
This also prevents a bug which occurs when we query the weight two
times for the same collapsed node, whose related collapsed region object
has been in the meantime destroyed by the tiling process.
2023-02-01 09:56:36 +00:00
Andrea Gussoni ebe0729332 Improve debug graphs for collapsed nodes
Integrate the debug graph serialization for collapsed nodes in the
RegionCFG.
2023-01-31 17:25:27 +00:00
Andrea Gussoni ca540399d4 Ensure that no backedges are left
Ensure that no backedges are left after the restructuring of all the
metaregions.

This additional assertion should help ensuring that no entries in the
`Backedges` set are left after the restructuring process, in turn making
it easier to spot bugs if backedges references are not handled correctly
during the steps of the restructuring.
2023-01-31 11:55:52 +01:00
Pietro Fezzardi f0573995ba MakeModelGEP: use branch-and-bound approach
Before this commit, MakeModelGEPPass was materializing all possible
traversals of the type system to select the best match for translating
some pointer arithmetic on the IR into ModelGEPs.

This proved to be very slow and to do a lot of useless computation on
larger binaries with big type systems.

This commit partially rewrites MakeModelGEPPass to adopt a
branch-and-bound approach to only explore paths on the type system that
have some chance of improving the best match.
2023-01-31 11:39:28 +01:00
Pietro Fezzardi 4e1fb3a854 DLA: fix CompactCompatibleArrays
Before this commit, the dla::Step CompactCompatibleArrays was
occasionally generating artificial nodes that were larger than the inner
data, forcing their size to Stride - AvailableSlack.
This commit fixes the problem keeping track of the actual size that is
consumed in the array element, and forcing the size of the artificial
nodes to that.
2023-01-24 16:50:42 +01:00
Andrea Gussoni db48424629 Handle Code and Collapsed node in shortest path
Assign a value to cloned and collapsed nodes in terms of shortest path
from entry, which is a criterion we use to elect region entry.
The shortest path is computed at the beginning for the nodes present in
the CFG, but needs to keep updated for additional nodes that we insert
that may become loop entry candidates.
2023-01-20 17:03:24 +00:00