## Quantitative Pointer Analysis for Programs on Hybrid DRAM-PM Memory Systems
#### Authors:李瑞恆, 陳鵬升
<br/>
#### Presenter: 郭康唯
---
- Abstract
- Introdcution
- Background
- Design and Implementaion
- Evaluation
- Conclusion
---
### Abstract

---
# Introcudion
- Hybrid Memory System
- Characteristics of PM and DRAM
- Contribution
----
#### Hybrid Memory System

----
#### Characteristics of PM and DRAM

----
#### Contribution
- A pointer analysis for hybrid DRAM-PM memory systems.
- Implementation
- Experiment
---
# Background
- PMDK
- MemorySSA
----
#### PMDK
```c=
void write_hello_string (char *buf, char *path)
{
// Create the pmemobj pool or open it if it already exists
PMEMobjpool *pop = pmemobj_create(path, LAYOUT, PMEMOBJ_MIN_POOL, 0666);
// Get the PMEMObj root
PMEMoid root = pmemobj_root(pop, sizeof (struct my_root));
// Pointer for structure at the root
struct my_root *rootp = pmemobj_direct(root);
rootp->val = 10;
// Close PMEM object pool
pmemobj_close(pop);
return;
}
```
----
#### MemorySSA
- MemoryDef
- MemoryUse
- MemoryPhi
- Clobber
----
#### MemoryDef
```llvmir=
define void @foo() {
%p1 = alloca i8, align 1
%p2 = alloca i8, align 1
; 1 = MemoryDef(liveOnEntry)
store i8 0, ptr %p1, align 1
; 2 = MemoryDef(1)
store i8 0, ptr %p2, align 1
; 3 = MemoryDef(2)
%1 = call ptr @pmemobj_create()
}
```
----
#### MemoryUse
```llvmir=
define void @foo() {
%p1 = alloca i8, align 1
; 1 = MemoryDef(liveOnEntry)
store i8 0, ptr %p1, align 1
; MemoryUse(1)
%1 = load i8, ptr %p1
}
```
----
#### MemoryPhi
```llvmir=
define void @foo() {
;if
%1 = alloca i32, align 4
%2 = alloca i32, align 4
; 1 = MemoryDef(liveOnEntry)
store i32 0, ptr %1, align 4
; 2 = MemoryDef(1)
store i32 1, ptr %2, align 4
; MemoryUse(2)
%3 = load i32, ptr %2, align 4
%4 = icmp eq i32 %3, 1
br i1 %4, label %5, label %6
5: ;then
; 3 = MemoryDef(2)
store i32 0, ptr %1, align 4
br label %7
6: ;else
; 4 = MemoryDef(2)
store i32 1, ptr %1, align 4
br label %7
7: ;return
; 5 = MemoryPhi({%5,3},{%6,4})
; MemoryUse(5)
%8 = load i32, ptr %1, align 4
ret i32 %8
}
```
----
#### Clobber
```llvmir=
define void @foo() {
%p1 = alloca i8, align 1
; 1 = MemoryDef(liveOnEntry)->liveOnEntry
store i8 0, ptr %p1, align 1
; 2 = MemoryDef(1)->1
store i8 3, ptr %p1, align 1
; MemoryUse(2)
%1 = load i8, ptr %p1, align 1
}
```
---
### Design and Implementaion
- algorithm
- inter-procedural analysis
- running example
----
#### algorithm

----
#### algorithm

----
#### algorithm

----
#### algorithm

----
#### inter-procedural analysis
- case1
- case2
----
#### case1
```llvmir=
define ptr @bar() {
%1 = call ptr @pmemobj_create()
ret ptr %1
}
define void @foo() {
%1 = call ptr @bar()
}
```
----
#### case2
```llvmir=
define i8 @bar(ptr %0) {
%1 = load i8, ptr %0, align 1
ret i8 %1
}
define void @foo() {
%1 = call ptr @pmemobj_create()
%2 = call ptr @bar(ptr %1)
}
```
----
#### running example
----
#### C code
```c=
void foo() {
int* ptr_dram = malloc();
int* ptr_pm = pmemobj_create();
*ptr_dram = 1;
*ptr_pm = 0;
}
```
----
#### LLVM IR
```llvmir=
define void @foo() {
; int* ptr_dram = malloc();
%1 = alloca ptr, align 8
; 1 = MemoryDef(liveOnEntry)->liveOnEntry
%2 = call ptr @malloc()
; 2 = MemoryDef(1)->liveOnEntry
store ptr %2, ptr %1, align 8
; int* ptr_pm = pmemobj_create();
%3 = alloca ptr, align 8
; 3 = MemoryDef(2)->1 MayAlias
%4 = call ptr @pmemobj_create()
; 4 = MemoryDef(3)->liveOnEntry
store ptr %4, ptr %3, align 8
; *ptr_dram = 1;
; MemoryUse(2) MustAlias
%5 = load ptr, ptr %1, align 8
; 5 = MemoryDef(4)->3 MayAlias
store i32 1, ptr %5, align 4
; *ptr_pm = 0;
; MemoryUse(4) MustAlias
%6 = load ptr, ptr %3, align 8
; 6 = MemoryDef(5)->5 MayAlias
store i32 0, ptr %6, align 4
}
```
----
#### StrongPM

----
#### StrongPM

----
#### StrongPM

----
#### StrongPM

----
#### StrongPM

----
#### NotPM

----
#### NotPM

----
#### NotPM

----
#### NotPM

----
#### NotPM

----
---
# Evaluation
- Configuration
- Methods
- Result
----
#### Configuration

----
#### Methods

----
#### Methods

----
#### Result

---
# Conclusion

----
```python
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
import os
import filecmp
key = AESGCM.generate_key(bit_length=256)
nonce = os.urandom(12)
input_file = "plain"
output_file = "cipher"
with open(input_file, "rb") as f:
plaintext = f.read()
aesgcm = AESGCM(key)
ciphertext = aesgcm.encrypt(nonce, plaintext, None)
with open(output_file, "wb") as f:
f.write(ciphertext)
```
{"title":"Paper-1","description":"Starting from x86_64_start_kernelimage.png","slideOptions":"{\"title\":\"Quantitative Pointer Analysis for Programs on Hybrid DRAM-PM Memory Systems\",\"tags\":\"presentation\",\"slideOptions\":{\"theme\":\"white\",\"transition\":\"fade\"}}","contributors":"[{\"id\":\"a52cef82-249b-4802-a80d-b9556709864b\",\"add\":15762,\"del\":9467}]"}