Skip to content

Commit 3a01607

Browse files
Fix hardware address dereferencing and subaddresses (#651)
* Fix hardware address dereferencing * Fix hardware address initialization * Range map for hardware addresses. * Refactor range maps * Fix rangeMapAppendSorted * Fix mergeRangeMaps * Some more fixes Co-authored-by: Virgil Serbanuta <virgil.serbanuta>
1 parent 175400b commit 3a01607

File tree

7 files changed

+170
-15
lines changed

7 files changed

+170
-15
lines changed

Diff for: semantics/c/language/common/conversion.k

+11-4
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ module C-CONVERSION
3030
imports C-SETTINGS-SYNTAX
3131
imports C-TYPING-EFFECTIVE-SYNTAX
3232
imports C-TYPING-SYNTAX
33+
imports LIST
3334
imports SET
3435

3536
rule intArithInterpret(T:UType, N:Int) => intArithInterpret(T, N, true)
@@ -284,14 +285,20 @@ module C-CONVERSION
284285
rule <k>(.K => IMPL("CCV13", "Conversion from an integer to non-null pointer."))
285286
~> cast(ut(... st: pointerType(_)) #as T'::UType, tv(V:CValue, integerUType #as T::UType), _)
286287
...</k>
287-
<hardware-addresses> HwAddr:Set </hardware-addresses>
288-
requires notBool isNullPointerConstant(tv(V, T)) andBool notBool V in HwAddr
288+
requires notBool isNullPointerConstant(tv(V, T)) andBool notBool #isHardwareAddress(V)
289289

290290
rule <k>(.K => IMPL("CCV13-H", "Conversion from an integer to non-null hardware-dependent pointer."))
291291
~> cast(ut(... st: pointerType(_)) #as T'::UType, tv(V:CValue, integerUType #as T::UType), _)
292292
...</k>
293-
<hardware-addresses>... SetItem(V) ...</hardware-addresses>
294-
requires notBool isNullPointerConstant(tv(V, T))
293+
requires notBool isNullPointerConstant(tv(V, T)) andBool #isHardwareAddress(V)
294+
295+
rule [[ #isHardwareAddress(Addr:Int) => rangeMapContains(M, Addr) ]]
296+
<hardware-addresses> M:RangeMap </hardware-addresses>
297+
rule #isHardwareAddress(Addr:CValue) => false
298+
requires notBool isInt(Addr)
299+
300+
rule [[findHardwareAddress(Addr:Int) => rangeMapFind(M, Addr)]]
301+
<hardware-addresses> M:RangeMap </hardware-addresses>
295302

296303
/*@ \fromStandard{\source[n1570]{\para{6.3.2.3}{6}}}{
297304
Any pointer type may be converted to an integer type. Except as previously

Diff for: semantics/c/language/common/expr/reference.k

+1-4
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,7 @@ module C-COMMON-EXPR-REFERENCE
7070
andBool Loc =/=K NullPointer
7171
andBool ifFromArrayInBounds(Loc,
7272
utype(pointerType(type(char))), 1) ==K true
73-
andBool
74-
(notBool hasLint
75-
orBool notBool (isNativeLoc(Loc) orBool isHardwareLoc(Loc))
76-
)
73+
andBool notBool (hasLint andBool isNativeLoc(Loc))
7774
[structural]
7875

7976
rule (.K => CV("CER6", "Unary '*' operator applied to non-pointer."))

Diff for: semantics/common/compat.k

+138
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ endmodule
77
module COMPAT-SYNTAX
88
imports COMPAT-SORTS
99
imports COMMON-SYNTAX
10+
imports LIST
1011

1112
syntax String ::= firstChar(String) [function]
1213
syntax String ::= lastChar(String) [function]
@@ -78,6 +79,23 @@ module COMPAT-SYNTAX
7879
// implements List[Idx <- Val]
7980
syntax List ::= myListUpdate(List, Int, KItem) [function]
8081

82+
83+
// Range map. It is recommended to use .rangeMap and rangeMapAppendSorted
84+
// to construct it.
85+
syntax RangeMap
86+
// A range item contains all integers between start and end, including both
87+
// ends.
88+
syntax RangeMapItem ::= rangeMapItem(start:Int, end:Int)
89+
syntax MaybeRangeMapItem ::= RangeMapItem | "noRangeMapItem"
90+
91+
syntax RangeMap ::= ".RangeMap" [function]
92+
syntax RangeMap ::= rangeMapAppendSorted(RangeMap, RangeMapItem) [function]
93+
// Each pair of ranges from the two maps be either identical, or disjoint.
94+
syntax RangeMap ::= mergeRangeMaps(RangeMap, RangeMap) [function]
95+
96+
syntax Bool ::= rangeMapContains(RangeMap, value:Int) [function]
97+
syntax MaybeRangeMapItem ::= rangeMapFind(RangeMap, value:Int) [function]
98+
8199
endmodule
82100

83101
module COMPAT-KAST [kast]
@@ -102,6 +120,7 @@ module COMPAT
102120
imports C-CONFIGURATION
103121
imports K-REFLECTION
104122
imports BOOL
123+
imports LIST
105124
imports MAP
106125
imports STRING
107126

@@ -294,4 +313,123 @@ module COMPAT
294313
)
295314
requires N >Int 0
296315

316+
317+
// The list must be sorted, must contain only RangeMapItem, and the ranges
318+
// must be disjoint.
319+
syntax RangeMap ::= rangeMap(List)
320+
321+
syntax RangeMap ::= #mergeRangeMaps(first:RangeMap, second:RangeMap, merged:RangeMap) [function]
322+
323+
// (the address at 'start' is <= 'addr') or (start == 0)
324+
// (the address at 'end' is >= 'addr') or (end == last-element).
325+
// If only one of them is equal to 'addr', we change the other one.
326+
syntax MaybeRangeMapItem ::= #rangeMapFind(RangeMap, value:Int, start:Int, end:Int) [function]
327+
syntax MaybeRangeMapItem ::= #rangeMapFindChoice(RangeMap, addr:Int, start:Int, middle:Int, middleItem:RangeMapItem, end:Int) [function]
328+
329+
syntax MaybeRangeMapItem ::= #checkInRangeMapItem(value:Int, RangeMapItem) [function]
330+
syntax MaybeRangeMapItem ::= #firstRangeMapItem(MaybeRangeMapItem, MaybeRangeMapItem) [function]
331+
332+
syntax Bool ::= isInRangeMapItem(addr:Int, RangeMapItem) [function]
333+
syntax RangeMapItem ::= asRangeMapItem(KItem) [function]
334+
335+
rule rangeMapContains(M:RangeMap, Value:Int)
336+
=> isRangeMapItem(rangeMapFind(M, Value))
337+
338+
rule rangeMapFind(rangeMap(.List), _:Int) => noRangeMapItem
339+
rule rangeMapFind(rangeMap(L:List) #as M:RangeMap, Value:Int)
340+
=> #rangeMapFind(M, Value, 0, size(L) -Int 1)
341+
[owise]
342+
343+
rule #rangeMapFind(rangeMap(L:List), Value:Int, Start:Int, Start)
344+
=> #checkInRangeMapItem(Value, asRangeMapItem(L[Start]))
345+
rule #rangeMapFind(rangeMap(L:List), Value:Int, Start:Int, End:Int)
346+
=> #firstRangeMapItem(
347+
#checkInRangeMapItem(Value, asRangeMapItem(L[Start])),
348+
#checkInRangeMapItem(Value, asRangeMapItem(L[End]))
349+
)
350+
requires Start ==Int End -Int 1
351+
rule #rangeMapFind(rangeMap(L:List) #as M:RangeMap, Value:Int, Start:Int, End:Int)
352+
=> #rangeMapFindChoice(
353+
M, Value, Start,
354+
(Start +Int End) /Int 2,
355+
asRangeMapItem(L[(Start +Int End) /Int 2]),
356+
End
357+
)
358+
requires Start <Int End -Int 1
359+
360+
rule #rangeMapFindChoice(M:RangeMap, Value:Int, Start:Int, Middle:Int, rangeMapItem(MiddleStart:Int, _:Int), _End:Int)
361+
=> #rangeMapFind(M, Value, Start, Middle)
362+
requires Value <Int MiddleStart
363+
rule #rangeMapFindChoice(M:RangeMap, Value:Int, _Start:Int, Middle:Int, rangeMapItem(MiddleStart:Int, _:Int), End:Int)
364+
=> #rangeMapFind(M, Value, Middle, End)
365+
requires Value >=Int MiddleStart
366+
367+
rule isInRangeMapItem(Value:Int, rangeMapItem(Start:Int, End:Int))
368+
=> Start <=Int Value andBool Value <=Int End
369+
370+
rule #checkInRangeMapItem(Value:Int, Item:RangeMapItem) => Item
371+
requires isInRangeMapItem(Value, Item)
372+
rule #checkInRangeMapItem(_:Int, _:RangeMapItem) => noRangeMapItem [owise]
373+
374+
rule #firstRangeMapItem(noRangeMapItem, Item:MaybeRangeMapItem) => Item
375+
rule #firstRangeMapItem(Item:RangeMapItem, _) => Item
376+
377+
rule asRangeMapItem(Item:RangeMapItem) => Item
378+
379+
rule .RangeMap => rangeMap(.List)
380+
rule rangeMapAppendSorted(
381+
rangeMap(.List),
382+
rangeMapItem(Start:Int, End:Int) #as Item:RangeMapItem
383+
)
384+
=> rangeMap(ListItem(Item))
385+
rule rangeMapAppendSorted(
386+
rangeMap(
387+
(_::List ListItem(rangeMapItem(_:Int, LastEnd:Int))) #as L::List),
388+
rangeMapItem(Start:Int, End:Int) #as Item:RangeMapItem
389+
)
390+
=> rangeMap(L ListItem(Item))
391+
requires LastEnd <Int Start andBool Start <=Int End
392+
393+
rule mergeRangeMaps(First:RangeMap, Second:RangeMap)
394+
=> #mergeRangeMaps(First, Second, .RangeMap)
395+
396+
rule #mergeRangeMaps(rangeMap(.List), rangeMap(.List), Merged:RangeMap)
397+
=> Merged
398+
rule #mergeRangeMaps(rangeMap(.List), rangeMap(L::List), rangeMap(Merged::List))
399+
=> rangeMap(Merged L)
400+
requires size(L) >Int 0
401+
rule #mergeRangeMaps(rangeMap(L::List), rangeMap(.List), rangeMap(Merged::List))
402+
=> rangeMap(Merged L)
403+
requires size(L) >Int 0
404+
rule #mergeRangeMaps(
405+
rangeMap(ListItem(rangeMapItem(Start:Int, End:Int) #as FirstItem) FirstRemainder:List),
406+
rangeMap(ListItem(rangeMapItem(Start:Int, End:Int)) SecondRemainder:List),
407+
Merged:RangeMap
408+
)
409+
=> #mergeRangeMaps(
410+
rangeMap(FirstRemainder),
411+
rangeMap(SecondRemainder),
412+
rangeMapAppendSorted(Merged, FirstItem)
413+
)
414+
rule #mergeRangeMaps(
415+
rangeMap(ListItem(rangeMapItem(FirstStart:Int, _:Int) #as FirstItem) FirstRemainder:List),
416+
rangeMap(ListItem(rangeMapItem(SecondStart:Int, _:Int)) _:List) #as Second:RangeMap,
417+
Merged:RangeMap
418+
)
419+
=> #mergeRangeMaps(
420+
rangeMap(FirstRemainder), Second,
421+
rangeMapAppendSorted(Merged, FirstItem)
422+
)
423+
requires FirstStart <Int SecondStart
424+
rule #mergeRangeMaps(
425+
rangeMap(ListItem(rangeMapItem(FirstStart:Int, _:Int)) _:List) #as First:RangeMap,
426+
rangeMap(ListItem(rangeMapItem(SecondStart:Int, _:Int) #as SecondItem) SecondRemainder:List),
427+
Merged:RangeMap
428+
)
429+
=> #mergeRangeMaps(
430+
First, rangeMap(SecondRemainder),
431+
rangeMapAppendSorted(Merged, SecondItem)
432+
)
433+
requires FirstStart >Int SecondStart
434+
297435
endmodule

Diff for: semantics/common/configuration.k

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ module COMMON-CONFIGURATION
55
imports SET
66
imports STRING-SYNTAX
77
imports COMMON-SYNTAX
8+
imports COMPAT-SYNTAX
89

910
configuration
1011
<global>
@@ -143,7 +144,7 @@ module COMMON-CONFIGURATION
143144
</tu>
144145
</translation-units>
145146

146-
<hardware-addresses> .Set </hardware-addresses>
147+
<hardware-addresses> .RangeMap </hardware-addresses>
147148
</global>
148149

149150
endmodule

Diff for: semantics/common/init.k

+12-3
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,22 @@ module COMMON-INIT
7575
rule <k> reportSuccess => .K ...</k>
7676
<result-value> _ => 0 </result-value>
7777

78-
rule initHardwareAddresses(hardwareAddresses(.K)) => .
79-
rule <k> initHardwareAddresses(hardwareAddresses((#hardwareAddress(Address:Int, Size:Int) => .K) ~> _:K)) ...</k>
80-
<hardware-addresses>... (.Set => SetItem(Address)) ... </hardware-addresses>
78+
syntax KItem ::= #initHardwareAddresses(KItem, previousAddress:Int)
79+
80+
rule initHardwareAddresses(hardwareAddresses(...) #as HwAddr:KItem) => #initHardwareAddresses(HwAddr, -1)
81+
rule #initHardwareAddresses(hardwareAddresses(.K), _) => .
82+
rule <k> #initHardwareAddresses(
83+
hardwareAddresses((#hardwareAddress(Address:Int, Size:Int) #as HwAddr:KItem => .K) ~> _:K),
84+
PreviousAddress:Int)
85+
...</k>
8186
<mem>...
8287
(.Map =>
8388
obj(Address, cfg:bitsPerByte *Int cfg:alignofPointer, hardwareAddress())
8489
|-> object(t(quals(.Set), .Set, arrayType(t(quals(.Set), .Set, char), Size)), Size, makeArray(Size, uninit))
8590
)
8691
...</mem>
92+
<hardware-addresses>
93+
M:RangeMap => rangeMapAppendSorted(M, rangeMapItem(Address, Address +Int Size -Int 1))
94+
</hardware-addresses>
95+
requires Address >Int PreviousAddress
8796
endmodule

Diff for: semantics/common/syntax.k

+3
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ endmodule
2020

2121
module COMMON-SYNTAX
2222
imports COMMON-SORTS
23+
imports LIST
2324
imports SET
2425
imports STRING-SYNTAX
2526

@@ -63,6 +64,8 @@ module COMMON-SYNTAX
6364
syntax KItem ::= hardwareAddresses(K)
6465
syntax KItem ::= #hardwareAddress(Int, Int)
6566
syntax KItem ::= initHardwareAddresses(KItem)
67+
syntax Bool ::= #isHardwareAddress(CValue) [function, withConfig]
68+
syntax MaybeRangeMapItem ::= findHardwareAddress(Int) [function, withConfig]
6669

6770
syntax LanguageLinkage ::= "CLinkage" | "CPPLinkage"
6871

Diff for: semantics/linking/init.k

+3-3
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ module LINKING-INIT
282282

283283
<translation-units> TUs1::Bag </translation-units>
284284

285-
<hardware-addresses> HwA1::Set </hardware-addresses>
285+
<hardware-addresses> HwA1:RangeMap </hardware-addresses>
286286
</global>),
287287
(<global>
288288
<mem> M2:Map </mem>
@@ -314,7 +314,7 @@ module LINKING-INIT
314314

315315
<translation-units> TUs2::Bag </translation-units>
316316

317-
<hardware-addresses> HwA2::Set </hardware-addresses>
317+
<hardware-addresses> HwA2:RangeMap </hardware-addresses>
318318
</global>))
319319
=>
320320
<global>
@@ -351,7 +351,7 @@ module LINKING-INIT
351351

352352
<translation-units> TUs1 TUs2 </translation-units>
353353

354-
<hardware-addresses> HwA1 |Set HwA2 </hardware-addresses>
354+
<hardware-addresses> mergeRangeMaps(HwA1, HwA2) </hardware-addresses>
355355
</global>
356356

357357
// TODO(chathhorn): remove redundancy

0 commit comments

Comments
 (0)