-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathMakefile
More file actions
165 lines (148 loc) · 6.32 KB
/
Makefile
File metadata and controls
165 lines (148 loc) · 6.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
SHELL := bash
CFLAGS = -g -Wall -Wno-misleading-indentation -Wno-incompatible-pointer-types \
-Wno-maybe-uninitialized
OP = -Op
CURR_DIR=$(abspath $(shell pwd))
OBJ_DIR = ELF
ASM_DIR = ASM
IR_DIR = IR
TEST_DIR = tests
TEST_SRC = $(wildcard $(TEST_DIR)/*.c)
TEST_OBJ = $(TEST_SRC:.c=.o)
BIN = mc
PEEP = squint
EXEC = $(BIN) $(BIN)-native $(PEEP) $(BIN)-so cdb # $(BIN)o
include mk/arm.mk
include mk/common.mk
## Build mc and squint
all: $(EXEC)
$(BIN): $(BIN).c
$(VECHO) " CC+LD\t\t$@\n"
$(Q)$(ARM_CC) $(CFLAGS) -o $@ $< -g -ldl
$(BIN)-so: $(BIN).c $(PEEP).c
$(VECHO) " CC+LD\t\t$@\n"
$(Q)if [ "$(shell uname -m)" != "aarch64" ]; then
$(Q)$(ARM_CC) -DSQUINT_SO=1 $(CFLAGS) -c -fpic $(PEEP).c
$(Q)$(ARM_CC) -shared -o lib$(PEEP).so $(PEEP).o
$(Q)$(ARM_CC) -DSQUINT_SO=1 -g $(CFLAGS) $(CURR_DIR)/lib$(PEEP).so -o $@ $< -ldl
else
$(Q)$(ARM_CC) -DSQUINT_SO=1 -g $(CFLAGS) -o $@ $< -ldl
fi
$(BIN)-native: $(BIN).c
$(VECHO) " CC+LD\t\t$@\n"
$(Q)$(CC) $(CFLAGS) -o $@ $< \
-Wno-pointer-to-int-cast -Wno-int-to-pointer-cast -Wno-format \
-ldl
$(PEEP): $(BIN) $(PEEP).c
$(VECHO) " CC+LD\t\t$@\n"
# Build an optimizer with ICACHE packing disabled
$(Q)$(ARM_EXEC) ./$(BIN) -Op -DNO_PACK_ICACHE=1 -o $(PEEP).tmp $(PEEP).c
$(Q)$(ARM_EXEC) cp $(PEEP).tmp $(PEEP)
$(Q)$(ARM_EXEC) scripts/peep $(PEEP).tmp
$(Q)$(ARM_EXEC) cp $(PEEP).tmp $(PEEP)
# Build an optimizer that is not *itself* ICACHE packed
# but that will generate ICACHE packed executables.
$(Q)$(ARM_EXEC) ./mc -Op -o $(PEEP).tmp $(PEEP).c
$(Q)$(ARM_EXEC) scripts/peep $(PEEP).tmp
$(Q)$(ARM_EXEC) cp $(PEEP).tmp $(PEEP)
$(Q)$(ARM_EXEC) rm $(PEEP).tmp
# All the floating point tests fail with this executable.
# Needs to be re-enabled after that issue is fixed.
# $(BIN)o: $(BIN) $(PEEP)
# $(VECHO) " CC+LD\t\t$@\n"
# # Build an optimizer with ICACHE packing disabled
# $(Q)$(ARM_EXEC) cat $(PEEP).c $(BIN).c > $(BIN)o.c
# $(Q)$(ARM_EXEC) ./$(BIN) -Op -DSQUINT_SO=1 -o $(BIN)o $(BIN)o.c
# $(Q)$(ARM_EXEC) scripts/peep $(BIN)o
# # Build an optimizer that is not *itself* ICACHE packed
# # but that will generate ICACHE packed executables.
# # When this is enabled, comment out lines at end of $(PEEP) target
# $(Q)$(ARM_EXEC) ./$(BIN) -Op -o $(PEEP).tmp $(PEEP).c
# $(Q)$(ARM_EXEC) scripts/peep $(PEEP).tmp
# $(Q)$(ARM_EXEC) cp $(PEEP).tmp $(PEEP)
# $(Q)$(ARM_EXEC) rm $(PEEP).tmp
# $(Q)$(ARM_EXEC) touch ./$(BIN)o
cdb: $(BIN)-so cdb.c
$(VECHO) " CC+LD\t\t$@\n"
$(Q)$(ARM_EXEC) ./$(BIN)-so -o cdb cdb.c
## Run tests and show message
check: $(EXEC) $(TEST_OBJ)
$(VECHO) "[ C to IR translation ]"
$(Q)./$(BIN)-native -s tests/arginc.c | diff tests/arginc.list - \
&& $(call pass)
$(VECHO) "[ JIT compilation + execution ]"
$(Q)if [ "$(shell $(ARM_EXEC) ./$(BIN) tests/hello.c)" = "hello, world" ]; then \
$(call pass); \
fi
$(VECHO) "[ ELF generation ]"
$(Q)$(ARM_EXEC) ./$(BIN) -o $(OBJ_DIR)/hello tests/hello.c
$(Q)if [ "$(shell $(ARM_EXEC) $(OBJ_DIR)/hello)" = "hello, world" ]; then \
$(call pass); \
fi
$(VECHO) "[ nested/self compilation ]"
$(Q)if [ "$(shell $(ARM_EXEC) ./$(BIN) $(BIN).c tests/hello.c)" = "hello, world" ]; then \
$(call pass); \
fi
@echo
@echo "Type 'make show_asm' to create assembly listing in ASM directory"
bench: $(EXEC) $(OBJ_DIR)/$(BIN)-opt
$(Q)$(ARM_EXEC) $(OBJ_DIR)/$(BIN)-opt $(OP) -o $(OBJ_DIR)/lulesh-opt $(TEST_DIR)/extra/lulesh.c
$(Q) scripts/peep $(OBJ_DIR)/lulesh-opt -e
$(Q) time $(ARM_EXEC) $(OBJ_DIR)/lulesh-opt
$(Q)$(ARM_EXEC) $(OBJ_DIR)/$(BIN)-opt $(OP) -o $(OBJ_DIR)/lulesh_p-opt $(TEST_DIR)/extra/lulesh_p.c
$(Q) scripts/peep $(OBJ_DIR)/lulesh_p-opt -e
$(Q) time $(ARM_EXEC) $(OBJ_DIR)/lulesh_p-opt
$(Q)$(ARM_EXEC) $(OBJ_DIR)/$(BIN)-opt $(OP) -o $(OBJ_DIR)/lulesh_s-opt $(TEST_DIR)/extra/lulesh_s.c
$(Q) scripts/peep $(OBJ_DIR)/lulesh_s-opt -e
$(Q) time $(ARM_EXEC) $(OBJ_DIR)/lulesh_s-opt
$(VECHO) "\n\n"
$(Q)$(ARM_EXEC) $(OBJ_DIR)/$(BIN)-opt $(OP) -o $(OBJ_DIR)/nbody_arr-opt $(TEST_DIR)/extra/nbody_arr.c
$(Q) scripts/peep $(OBJ_DIR)/nbody_arr-opt -e
$(Q) time $(ARM_EXEC) $(OBJ_DIR)/nbody_arr-opt
$(OBJ_DIR)/$(BIN): $(BIN)
$(VECHO) " SelfCC\t$@\n"
$(Q)$(ARM_EXEC) ./$^ -o $@ $(BIN).c
$(OBJ_DIR)/$(BIN)-opt: $(BIN) $(PEEP)
$(VECHO) " SelfCC\t$@\n"
$(Q)$(ARM_EXEC) ./$< $(OP) -o $@ $(BIN).c
$(Q) scripts/peep $@
.ONESHELL:
SHELL_HACK := $(shell mkdir -p $(IR_DIR) $(OBJ_DIR) $(ASM_DIR))
$(TEST_DIR)/%.o: $(TEST_DIR)/%.c $(BIN) $(OBJ_DIR)/$(BIN) $(OBJ_DIR)/$(BIN)-opt
$(VECHO) "[*** verify $< <IR> *******]\n"
$(Q)$(ARM_EXEC) ./$(BIN) -si $< > $(IR_DIR)/$(notdir $(basename $<))
$(VECHO) "[*** verify $< <JIT> *******]\n"
$(Q)$(ARM_EXEC) ./$(BIN) $< 2 $(REDIR)
$(VECHO) "[*** verify $< <JIT-opt> *******]\n"
$(Q)$(ARM_EXEC) ./$(BIN)-so $< 2 $(REDIR)
$(VECHO) "[*** verify $< <ELF> *******]\n"
$(Q)$(ARM_EXEC) ./$(BIN) -o $(OBJ_DIR)/$(notdir $(basename $<)) $< $(REDIR)
$(Q)$(ARM_EXEC) $(OBJ_DIR)/$(notdir $(basename $<)) 2 $(REDIR)
$(VECHO) "[*** verify $< <ELF-self> **]\n"
$(Q)$(ARM_EXEC) ./$(OBJ_DIR)/$(BIN) $< 2 $(REDIR)
$(VECHO) "[*** verify $< <ELF-so-opt> *******]\n"
$(Q)$(ARM_EXEC) ./$(BIN)-so -o $(OBJ_DIR)/$(notdir $(basename $<))-opt $< $(REDIR)
$(Q)$(ARM_EXEC) $(OBJ_DIR)/$(notdir $(basename $<))-opt 2 $(REDIR)
$(VECHO) "[*** verify $< <ELF-opt> *******]\n"
$(Q)$(ARM_EXEC) $(OBJ_DIR)/$(BIN)-opt $(OP) -o $(OBJ_DIR)/$(notdir $(basename $<))-opt $< $(REDIR)
$(Q) scripts/peep $(OBJ_DIR)/$(notdir $(basename $<))-opt
$(Q)$(ARM_EXEC) $(OBJ_DIR)/$(notdir $(basename $<))-opt 2 $(REDIR)
# Re-enable this when mco FP bug is fixed.
# $(VECHO) "[*** verify $< <mco> *******]\n"
# $(Q)$(ARM_EXEC) ./$(BIN)o -o $(OBJ_DIR)/$(notdir $(basename $<))-opt $< $(REDIR)
# $(Q)$(ARM_EXEC) $(OBJ_DIR)/$(notdir $(basename $<))-opt 2 $(REDIR)
$(Q)$(call pass,$<)
show_asm:
cd $(OBJ_DIR); for name in * ; do echo $${name};\
../scripts/disasm $${name} | egrep -v nop | tail --lines=+21 | \
awk '/e92d4[80]00/{print "--func--"}1' > ../$(ASM_DIR)/$${name}.s; done
## Print available build targets
help:
@cat $(MAKEFILE_LIST) | \
awk '/^##.*$$/{l1=$$0;getline;l2=(l1 "##" $$0); print l2 $$0}' | awk -F"##" '{split($$3,t,":");printf "\033[36m%-11s\033[0m %s\n",t[1],$$2}'
## Dump assembly from source file. Usage: "make dump-ir FILE=tests/hello.c"
dump-ir: $(BIN)
@$(ARM_EXEC) $(BIN) -s $(FILE)
## Remove all generated files
clean:
$(RM) $(EXEC) $(OBJ_DIR)/* $(PEEP).o lib$(PEEP).so $(ASM_DIR)/* $(IR_DIR)/*