Skip to content

Commit 70e5185

Browse files
committed
fixup! add unit tests for patching
1 parent 96aee79 commit 70e5185

6 files changed

Lines changed: 136 additions & 3 deletions

File tree

lib/patchestry/Passes/InstrumentationPass.cpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -747,7 +747,14 @@ namespace patchestry::passes {
747747
// Parse integer constant
748748
int64_t int_val =
749749
std::stoll(const_value, nullptr, 0); // Support hex, oct, dec
750-
auto attr = mlir::IntegerAttr::get(patch_arg_type, int_val);
750+
751+
auto attr = cir::IntAttr::get(
752+
cir::IntType::get(
753+
builder.getContext(), int_type.getWidth(),
754+
int_type.isSigned()
755+
),
756+
llvm::APSInt(int_type.getWidth(), int_val)
757+
);
751758
arg_value = builder.create< cir::ConstantOp >(
752759
call_op->getLoc(), patch_arg_type, attr
753760
);
@@ -763,8 +770,12 @@ namespace patchestry::passes {
763770
// Parse pointer constant (usually hex address)
764771
uint64_t ptr_val = std::stoull(const_value, nullptr, 0);
765772
auto int_type = cir::IntType::get(builder.getContext(), 64, false);
766-
auto int_attr = mlir::IntegerAttr::get(
767-
int_type, static_cast< int64_t >(ptr_val)
773+
auto int_attr = cir::IntAttr::get(
774+
cir::IntType::get(
775+
builder.getContext(), int_type.getWidth(),
776+
int_type.isSigned()
777+
),
778+
llvm::APSInt(int_type.getWidth(), ptr_val)
768779
);
769780
auto int_const = builder.create< cir::ConstantOp >(
770781
call_op->getLoc(), int_type, int_attr
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
// RUN: bash %strip-json-comments %s > %t.json
2+
// RUN: %patchir-decomp -input %t.json -emit-cir -output %t1 >> /dev/null 2>&1
3+
4+
{"arch":"ARM","id":"ARM:LE:32:Cortex","format":"Executable and Linking Format (ELF)","functions":{"ram:08000464":{"name":"bl_led_loop","is_intrinsic":false,"type":{"return_type":"39b07d98:3668971807161360215","is_variadic":false,"is_noreturn":false,"parameter_types":[]},"basic_blocks":{"ram:08000464:0:basic":{"operations":{"ram:0800046c:16:3":{"mnemonic":"CALL","has_return_value":true,"target":{"kind":"function","function":"ram:080020ba","is_variadic":false,"is_noreturn":false},"inputs":[{"type":"e0931073:3668971807012462429","kind":"constant","value":1207960576},{"type":"e078b2eb:3668971807161360202","kind":"constant","value":4096}]},"ram:08000476:22:4":{"mnemonic":"INT_EQUAL","type":"55cce7b8","inputs":[{"type":"c3df7963:3668971807161360217","kind":"global","global":"ram:20000004"},{"type":"c3df7963:3668971807161360217","kind":"constant","value":0}]},"ram:08000476:23:5":{"mnemonic":"CBRANCH","taken_block":"ram:08000478:1:basic","not_taken_block":"ram:08000486:2:basic","condition":{"type":"55cce7b8","kind":"temporary","operation":"ram:08000476:22:4"}}},"ordered_operations":["ram:0800046c:16:3","ram:08000476:22:4","ram:08000476:23:5"]},"ram:08000478:1:basic":{"operations":{"ram:08000480:390:0":{"mnemonic":"ADDRESS_OF","type":"c31bf672","inputs":[{"type":"8bc0399e","kind":"global","global":"ram:20008458"}]},"ram:08000480:401:1":{"mnemonic":"PTRADD","type":"c31bf672","inputs":[{"type":"c31bf672","kind":"temporary","operation":"ram:08000480:390:0"},{"type":"56d5e94b","kind":"global","global":"ram:20008454"},{"type":"2c7b6d4","kind":"constant","value":16}]},"ram:08000480:402:2":{"mnemonic":"PTRSUB","type":"81079e9","inputs":[{"type":"c31bf672","kind":"temporary","operation":"ram:08000480:401:1"},{"type":"2c7b6d4","kind":"constant","value":8}]},"ram:08000480:39:3":{"mnemonic":"LOAD","type":"e0931073:3668971807012462429","inputs":[{"type":"81079e9","kind":"temporary","operation":"ram:08000480:402:2"}]},"ram:08000480:392:4":{"mnemonic":"ADDRESS_OF","type":"c31bf672","inputs":[{"type":"8bc0399e","kind":"global","global":"ram:20008458"}]},"ram:08000480:403:5":{"mnemonic":"PTRADD","type":"c31bf672","inputs":[{"type":"c31bf672","kind":"temporary","operation":"ram:08000480:392:4"},{"type":"56d5e94b","kind":"global","global":"ram:20008454"},{"type":"2c7b6d4","kind":"constant","value":16}]},"ram:08000480:404:6":{"mnemonic":"PTRSUB","type":"81079e9","inputs":[{"type":"c31bf672","kind":"temporary","operation":"ram:08000480:403:5"},{"type":"2c7b6d4","kind":"constant","value":12}]},"ram:08000480:41:7":{"mnemonic":"LOAD","type":"e0931073:3668971807012462429","inputs":[{"type":"81079e9","kind":"temporary","operation":"ram:08000480:404:6"}]},"ram:08000480:410:8":{"mnemonic":"CAST","type":"81079e9","inputs":[{"type":"e0931073:3668971807012462429","kind":"temporary","operation":"ram:08000480:41:7"}]},"ram:08000484:43:12":{"mnemonic":"STORE","inputs":[{"type":"81079e9","kind":"temporary","operation":"ram:08000480:410:8"},{"type":"e0931073:3668971807012462429","kind":"temporary","operation":"ram:08000480:39:3"}]},"ram:08000478:1:basic.exit":{"mnemonic":"BRANCH","target_block":"ram:08000486:2:basic"}},"ordered_operations":["ram:08000480:390:0","ram:08000480:401:1","ram:08000480:402:2","ram:08000480:39:3","ram:08000480:392:4","ram:08000480:403:5","ram:08000480:404:6","ram:08000480:41:7","ram:08000480:410:8","ram:08000484:43:12","ram:08000478:1:basic.exit"]},"ram:08000486:2:basic":{"operations":{"ram:0800048a:49:3":{"mnemonic":"INT_ADD","type":"56d5e94b","output":{"kind":"global","global":"ram:20008454"},"inputs":[{"type":"56d5e94b","kind":"global","global":"ram:20008454"},{"type":"56d5e94b","kind":"constant","value":1}]},"ram:08000492:62:4":{"mnemonic":"INT_LESSEQUAL","type":"55cce7b8","inputs":[{"type":"56d5e94b","kind":"global","global":"ram:20008558"},{"type":"56d5e94b","kind":"global","global":"ram:20008454"}]},"ram:08000496:74:5":{"mnemonic":"CBRANCH","taken_block":"ram:08000496:3:basic","not_taken_block":"ram:0800049a:4:basic","condition":{"type":"55cce7b8","kind":"temporary","operation":"ram:08000492:62:4"}}},"ordered_operations":["ram:0800048a:49:3","ram:08000492:62:4","ram:08000496:74:5"]},"ram:08000496:3:basic":{"operations":{"ram:08000498:82:0":{"mnemonic":"COPY","type":"56d5e94b","output":{"kind":"global","global":"ram:20008454"},"inputs":[{"type":"56d5e94b","kind":"constant","value":0}]},"ram:08000496:3:basic.exit":{"mnemonic":"BRANCH","target_block":"ram:0800049a:4:basic"}},"ordered_operations":["ram:08000498:82:0","ram:08000496:3:basic.exit"]},"ram:0800049a:4:basic":{"operations":{"ram:0800049c:90:1":{"mnemonic":"INT_EQUAL","type":"55cce7b8","inputs":[{"type":"c3df7963:3668971807161360217","kind":"global","global":"ram:20000004"},{"type":"c3df7963:3668971807161360217","kind":"constant","value":1}]},"ram:0800049e:96:2":{"mnemonic":"CBRANCH","taken_block":"ram:080004a0:7:basic","not_taken_block":"ram:080004c2:5:basic","condition":{"type":"55cce7b8","kind":"temporary","operation":"ram:0800049c:90:1"}}},"ordered_operations":["ram:0800049c:90:1","ram:0800049e:96:2"]},"ram:080004c2:5:basic":{"operations":{"ram:080004c2:180:0":{"mnemonic":"INT_EQUAL","type":"55cce7b8","inputs":[{"type":"c3df7963:3668971807161360217","kind":"global","global":"ram:20000004"},{"type":"c3df7963:3668971807161360217","kind":"constant","value":0}]},"ram:080004c4:186:1":{"mnemonic":"CBRANCH","taken_block":"ram:080004c6:6:basic","not_taken_block":"ram:080004be:10:basic","condition":{"type":"55cce7b8","kind":"temporary","operation":"ram:080004c2:180:0"}}},"ordered_operations":["ram:080004c2:180:0","ram:080004c4:186:1"]},"ram:080004c6:6:basic":{"operations":{"ram:080004ce:394:0":{"mnemonic":"ADDRESS_OF","type":"c31bf672","inputs":[{"type":"8bc0399e","kind":"global","global":"ram:20008458"}]},"ram:080004ce:405:1":{"mnemonic":"PTRADD","type":"c31bf672","inputs":[{"type":"c31bf672","kind":"temporary","operation":"ram:080004ce:394:0"},{"type":"56d5e94b","kind":"global","global":"ram:20008454"},{"type":"2c7b6d4","kind":"constant","value":16}]},"ram:080004ce:406:2":{"mnemonic":"PTRSUB","type":"81079e9","inputs":[{"type":"c31bf672","kind":"temporary","operation":"ram:080004ce:405:1"},{"type":"2c7b6d4","kind":"constant","value":12}]},"ram:080004ce:202:3":{"mnemonic":"LOAD","type":"e0931073:3668971807012462429","inputs":[{"type":"81079e9","kind":"temporary","operation":"ram:080004ce:406:2"}]},"ram:080004ce:411:4":{"mnemonic":"CAST","type":"81079e9","inputs":[{"type":"e0931073:3668971807012462429","kind":"temporary","operation":"ram:080004ce:202:3"}]},"ram:080004d0:388:5":{"mnemonic":"ADDRESS_OF","type":"c31bf672","inputs":[{"type":"8bc0399e","kind":"global","global":"ram:20008458"}]},"ram:080004d0:407:6":{"mnemonic":"PTRADD","type":"c31bf672","inputs":[{"type":"c31bf672","kind":"temporary","operation":"ram:080004d0:388:5"},{"type":"56d5e94b","kind":"global","global":"ram:20008454"},{"type":"2c7b6d4","kind":"constant","value":16}]},"ram:080004d0:408:7":{"mnemonic":"PTRSUB","type":"81079e9","inputs":[{"type":"c31bf672","kind":"temporary","operation":"ram:080004d0:407:6"},{"type":"2c7b6d4","kind":"constant","value":4}]},"ram:080004d0:204:8":{"mnemonic":"LOAD","type":"e0931073:3668971807012462429","inputs":[{"type":"81079e9","kind":"temporary","operation":"ram:080004d0:408:7"}]},"ram:080004d2:206:12":{"mnemonic":"STORE","inputs":[{"type":"81079e9","kind":"temporary","operation":"ram:080004ce:411:4"},{"type":"e0931073:3668971807012462429","kind":"temporary","operation":"ram:080004d0:204:8"}]},"ram:080004d4:207:13":{"mnemonic":"BRANCH","target_block":"ram:080004be:10:basic"}},"ordered_operations":["ram:080004ce:394:0","ram:080004ce:405:1","ram:080004ce:406:2","ram:080004ce:202:3","ram:080004ce:411:4","ram:080004d0:388:5","ram:080004d0:407:6","ram:080004d0:408:7","ram:080004d0:204:8","ram:080004d2:206:12","ram:080004d4:207:13"]},"ram:080004a0:7:basic":{"operations":{"ram:080004a4:102:0":{"mnemonic":"INT_ADD","type":"56d5e94b","output":{"kind":"local","operation":"unique:000da100:0:0"},"inputs":[{"type":"56d5e94b","kind":"global","global":"ram:20008454"},{"type":"56d5e94b","kind":"constant","value":1}]},"ram:080004aa:122:1":{"mnemonic":"INT_LESSEQUAL","type":"55cce7b8","inputs":[{"type":"56d5e94b","kind":"global","global":"ram:20008558"},{"type":"56d5e94b","kind":"local","operation":"unique:000da100:0:0"}]},"ram:080004aa:123:2":{"mnemonic":"CBRANCH","taken_block":"ram:080004aa:8:basic","not_taken_block":"ram:080004ac:9:basic","condition":{"type":"55cce7b8","kind":"temporary","operation":"ram:080004aa:122:1"}}},"ordered_operations":["ram:080004a4:102:0","ram:080004aa:122:1","ram:080004aa:123:2"]},"ram:080004aa:8:basic":{"operations":{"ram:080004aa:124:0":{"mnemonic":"COPY","type":"56d5e94b","output":{"kind":"local","operation":"unique:000da100:0:0"},"inputs":[{"type":"56d5e94b","kind":"constant","value":0}]},"ram:080004aa:8:basic.exit":{"mnemonic":"BRANCH","target_block":"ram:080004ac:9:basic"}},"ordered_operations":["ram:080004aa:124:0","ram:080004aa:8:basic.exit"]},"ram:080004ac:9:basic":{"operations":{"ram:080004ae:387:1":{"mnemonic":"ADDRESS_OF","type":"c31bf672","inputs":[{"type":"8bc0399e","kind":"global","global":"ram:20008458"}]},"ram:080004ae:398:2":{"mnemonic":"PTRADD","type":"c31bf672","inputs":[{"type":"c31bf672","kind":"temporary","operation":"ram:080004ae:387:1"},{"type":"56d5e94b","kind":"local","operation":"unique:000da100:0:0"},{"type":"2c7b6d4","kind":"constant","value":16}]},"ram:080004ae:409:3":{"mnemonic":"PTRSUB","type":"3cd9aa2a","inputs":[{"type":"c31bf672","kind":"temporary","operation":"ram:080004ae:398:2"},{"type":"2c7b6d4","kind":"constant","value":0}]},"ram:080004ae:143:4":{"mnemonic":"LOAD","type":"f6bd5cf1:3668971807161360199","inputs":[{"type":"3cd9aa2a","kind":"temporary","operation":"ram:080004ae:409:3"}]},"ram:080004b0:148:8":{"mnemonic":"CALL","has_return_value":true,"target":{"kind":"function","function":"ram:08000a14","is_variadic":false,"is_noreturn":false},"inputs":[{"type":"f6bd5cf1:3668971807161360199","kind":"temporary","operation":"ram:080004ae:143:4"}]},"ram:080004ba:159:12":{"mnemonic":"CALL","has_return_value":true,"target":{"kind":"function","function":"ram:080020be","is_variadic":false,"is_noreturn":false},"inputs":[{"type":"e0931073:3668971807012462429","kind":"constant","value":1207960576},{"type":"e078b2eb:3668971807161360202","kind":"constant","value":4096}]},"ram:080004ac:9:basic.exit":{"mnemonic":"BRANCH","target_block":"ram:080004be:10:basic"}},"ordered_operations":["ram:080004ae:387:1","ram:080004ae:398:2","ram:080004ae:409:3","ram:080004ae:143:4","ram:080004b0:148:8","ram:080004ba:159:12","ram:080004ac:9:basic.exit"]},"ram:080004be:10:basic":{"operations":{"ram:080004c0:248:3":{"mnemonic":"COPY","type":"39b07d98:3668971807161360215","inputs":[{"type":"39b07d98:3668971807161360215","kind":"constant","value":0}]},"ram:080004c0:175:7":{"mnemonic":"RETURN","inputs":[{"type":"39b07d98:3668971807161360215","kind":"temporary","operation":"ram:080004c0:248:3"}]}},"ordered_operations":["ram:080004c0:248:3","ram:080004c0:175:7"]},"ram:08000464:entry":{"operations":{"unique:000da100:0:0":{"mnemonic":"DECLARE_LOCAL","kind":"local","name":"uVar1","type":"56d5e94b"},"entry.exit":{"mnemonic":"BRANCH","target_block":"ram:08000464:0:basic"}},"ordered_operations":["unique:000da100:0:0","entry.exit"]}},"entry_block":"ram:08000464:entry"},"ram:080020ba":{"name":"gpio_set","is_intrinsic":false,"type":{"return_type":"56e6a64d","is_variadic":false,"is_noreturn":false,"parameter_types":["e0931073:3668971807012462429","e078b2eb:3668971807161360202"]}},"ram:08000a14":{"name":"bl_spi_send","is_intrinsic":false,"type":{"return_type":"56e6a64d","is_variadic":false,"is_noreturn":false,"parameter_types":["f6bd5cf1:3668971807161360199"]}},"ram:080020be":{"name":"gpio_clear","is_intrinsic":false,"type":{"return_type":"56e6a64d","is_variadic":false,"is_noreturn":false,"parameter_types":["e0931073:3668971807012462429","e078b2eb:3668971807161360202"]}}},"globals":{"ram:20008458":{"name":"bl_led_channel","size":"256","type":"8bc0399e"},"ram:20008558":{"name":"bl_led_count","size":"4","type":"56d5e94b"},"ram:20000004":{"name":"bl_spi_mode","size":"1","type":"c3df7963:3668971807161360217"},"ram:20008454":{"name":"bl_led_active","size":"4","type":"56d5e94b"}},"types":{"39b07d98:3668971807161360215":{"name":"bl_error","kind":"enum","size":1,"num_entries":16,"entries":[{"name":"BL_ERROR_NONE","value":0},{"name":"BL_ERROR_OUT_OF_RANGE","value":1},{"name":"BL_ERROR_BAD_MESSAGE_TYPE","value":2},{"name":"BL_ERROR_BAD_MESSAGE_LENGTH","value":3},{"name":"BL_ERROR_BAD_SOURCE_MASK","value":4},{"name":"BL_ERROR_MODE_MISMATCH","value":5},{"name":"BL_ERROR_ACTIVE_ACQUISITION","value":6},{"name":"BL_ERROR_BAD_FREQUENCY","value":7},{"name":"BL_ERROR_NOT_IMPLEMENTED","value":8},{"name":"BL_ERROR_HARDWARE_CONFLICT","value":9},{"name":"BL_ERROR_ADC_FREQ_TOO_HIGH","value":10},{"name":"BL_ERROR_ADC_DMA_BUFFER","value":11},{"name":"BL_ERROR_DAC_BAD_CHANNEL","value":12},{"name":"BL_ERROR_DAC_BAD_OFFSET","value":13},{"name":"BL_ERROR_OPAMP_BAD_GAIN","value":14},{"name":"BL_ERROR_TIMER_BAD_FREQUENCY","value":15}]},"e0931073:3668971807012462429":{"name":"uint32_t","kind":"typedef","size":4,"base_type":"67aa9975"},"e078b2eb:3668971807161360202":{"name":"uint16_t","kind":"typedef","size":2,"base_type":"56f4df99"},"55cce7b8":{"name":"bool","size":1,"kind":"integer"},"c3df7963:3668971807161360217":{"name":"bl_acq_spi_mode","kind":"enum","size":1,"num_entries":4,"entries":[{"name":"BL_ACQ_SPI_NONE","value":0},{"name":"BL_ACQ_SPI_MOTHER","value":1},{"name":"BL_ACQ_SPI_DAUGHTER","value":2},{"name":"BL_ACQ_SPI_INIT","value":3}]},"c31bf672":{"kind":"pointer","size":4,"element_type":"e8d4c1d:3668971807161360222"},"8bc0399e":{"kind":"array","size":256,"num_elements":16,"element_type":"e8d4c1d:3668971807161360222"},"56d5e94b":{"name":"unsigned int","size":4,"kind":"integer"},"2c7b6d4":{"name":"int","size":4,"kind":"integer"},"81079e9":{"kind":"pointer","size":4,"element_type":"e0931073:3668971807012462429"},"3cd9aa2a":{"kind":"pointer","size":4,"element_type":"f6bd5cf1:3668971807161360199"},"f6bd5cf1:3668971807161360199":{"name":"uint8_t","kind":"typedef","size":1,"base_type":"838fb935"},"56e6a64d":{"name":"void","size":0,"kind":"void"},"67aa9975":{"name":"unsigned int","size":4,"kind":"integer"},"56f4df99":{"name":"unsigned short","size":2,"kind":"integer"},"e8d4c1d:3668971807161360222":{"name":"bl_led_channel_t","kind":"struct","size":16,"fields":[{"type":"f6bd5cf1:3668971807161360199","offset":0,"name":"led"},{"type":"f6bd5cf1:3668971807161360199","offset":1,"name":"src_mask"},{"type":"e0931073:3668971807012462429","offset":4,"name":"gpios"},{"type":"e0931073:3668971807012462429","offset":8,"name":"gpior"},{"type":"e0931073:3668971807012462429","offset":12,"name":"gpio_bsrr"}]},"838fb935":{"name":"unsigned char","size":1,"kind":"integer"}}}

test/patchir-transform/bl_usb__send_message.json

Lines changed: 15 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
arch: "ARM:LE:32"
2+
patches:
3+
- name: "apply_before_write_packet"
4+
match:
5+
name: "usbd_ep_write_packet"
6+
kind: "function"
7+
argument_matches:
8+
- index: 0
9+
name: "usb_g"
10+
patch:
11+
mode: "ApplyAfter"
12+
patch_file: "patch_usbd_ep_write_packet.c"
13+
patch_function: "patch::after::usbd_ep_write_packet"
14+
arguments:
15+
- name: "function_return_value"
16+
source: "return_value"
17+
exclude:
18+
- ""
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
arch: "ARM:LE:32"
2+
patches:
3+
- name: "apply_before_write_packet"
4+
match:
5+
name: "usbd_ep_write_packet"
6+
kind: "function"
7+
patch:
8+
mode: "ApplyBefore"
9+
patch_file: "patch_usbd_ep_write_packet.c"
10+
patch_function: "patch::before::usbd_ep_write_packet"
11+
arguments:
12+
- name: "operand_0"
13+
source: "operand"
14+
index: "0"
15+
- name: "constant_1"
16+
source: "constant"
17+
value: "0x82"
18+
- name: "variable_2"
19+
source: "variable"
20+
symbol: "var1"
21+
- name: "variable_4"
22+
source: "variable"
23+
symbol: "var3"
24+
exclude:
25+
- ""

0 commit comments

Comments
 (0)