Skip to content

Commit

Permalink
revert libpanda with clang (commaai#2044)
Browse files Browse the repository at this point in the history
* revert

* adapt this
  • Loading branch information
maxime-desroches authored Sep 26, 2024
1 parent 78b49ab commit b6644f7
Show file tree
Hide file tree
Showing 9 changed files with 78 additions and 72 deletions.
4 changes: 4 additions & 0 deletions SConstruct
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ AddOption('--ubsan',
action='store_true',
help='turn on UBSan')

AddOption('--coverage',
action='store_true',
help='build with test coverage options')

AddOption('--compile_db',
action='store_true',
help='build clang compilation database')
Expand Down
28 changes: 15 additions & 13 deletions board/safety/safety_ford.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,10 @@ static uint8_t ford_get_counter(const CANPacket_t *to_push) {
if (addr == FORD_BrakeSysFeatures) {
// Signal: VehVActlBrk_No_Cnt
cnt = (GET_BYTE(to_push, 2) >> 2) & 0xFU;
}
if (addr == FORD_Yaw_Data_FD1) {
} else if (addr == FORD_Yaw_Data_FD1) {
// Signal: VehRollYaw_No_Cnt
cnt = GET_BYTE(to_push, 5);
} else {
}
return cnt;
}
Expand All @@ -43,10 +43,10 @@ static uint32_t ford_get_checksum(const CANPacket_t *to_push) {
if (addr == FORD_BrakeSysFeatures) {
// Signal: VehVActlBrk_No_Cs
chksum = GET_BYTE(to_push, 3);
}
if (addr == FORD_Yaw_Data_FD1) {
} else if (addr == FORD_Yaw_Data_FD1) {
// Signal: VehRollYawW_No_Cs
chksum = GET_BYTE(to_push, 4);
} else {
}
return chksum;
}
Expand All @@ -60,14 +60,14 @@ static uint32_t ford_compute_checksum(const CANPacket_t *to_push) {
chksum += GET_BYTE(to_push, 2) >> 6; // VehVActlBrk_D_Qf
chksum += (GET_BYTE(to_push, 2) >> 2) & 0xFU; // VehVActlBrk_No_Cnt
chksum = 0xFFU - chksum;
}
if (addr == FORD_Yaw_Data_FD1) {
} else if (addr == FORD_Yaw_Data_FD1) {
chksum += GET_BYTE(to_push, 0) + GET_BYTE(to_push, 1); // VehRol_W_Actl
chksum += GET_BYTE(to_push, 2) + GET_BYTE(to_push, 3); // VehYaw_W_Actl
chksum += GET_BYTE(to_push, 5); // VehRollYaw_No_Cnt
chksum += GET_BYTE(to_push, 6) >> 6; // VehRolWActl_D_Qf
chksum += (GET_BYTE(to_push, 6) >> 4) & 0x3U; // VehYawWActl_D_Qf
chksum = 0xFFU - chksum;
} else {
}

return chksum;
Expand All @@ -79,12 +79,11 @@ static bool ford_get_quality_flag_valid(const CANPacket_t *to_push) {
bool valid = false;
if (addr == FORD_BrakeSysFeatures) {
valid = (GET_BYTE(to_push, 2) >> 6) == 0x3U; // VehVActlBrk_D_Qf
}
if (addr == FORD_EngVehicleSpThrottle2) {
} else if (addr == FORD_EngVehicleSpThrottle2) {
valid = ((GET_BYTE(to_push, 4) >> 5) & 0x3U) == 0x3U; // VehVActlEng_D_Qf
}
if (addr == FORD_Yaw_Data_FD1) {
} else if (addr == FORD_Yaw_Data_FD1) {
valid = ((GET_BYTE(to_push, 6) >> 4) & 0x3U) == 0x3U; // VehYawWActl_D_Qf
} else {
}
return valid;
}
Expand Down Expand Up @@ -317,7 +316,8 @@ static int ford_fwd_hook(int bus_num, int addr) {
// Forward all traffic from bus 0 onward
bus_fwd = FORD_CAM_BUS;
break;
} case FORD_CAM_BUS: {
}
case FORD_CAM_BUS: {
if (ford_lkas_msg_check(addr)) {
// Block stock LKAS and UI messages
bus_fwd = -1;
Expand All @@ -329,10 +329,12 @@ static int ford_fwd_hook(int bus_num, int addr) {
bus_fwd = FORD_MAIN_BUS;
}
break;
} default: {
}
default: {
// No other buses should be in use; fallback to do-not-forward
bus_fwd = -1;
break;}
break;
}
}

return bus_fwd;
Expand Down
5 changes: 3 additions & 2 deletions board/safety/safety_gm.h
Original file line number Diff line number Diff line change
Expand Up @@ -227,11 +227,12 @@ static safety_config gm_init(uint16_t param) {
{0x1E1, 2, 7}, {0x184, 2, 8}}; // camera bus

gm_hw = GET_FLAG(param, GM_PARAM_HW_CAM) ? GM_CAM : GM_ASCM;

if (gm_hw == GM_ASCM) {
gm_long_limits = &GM_ASCM_LONG_LIMITS;
}
if (gm_hw == GM_CAM) {
} else if (gm_hw == GM_CAM) {
gm_long_limits = &GM_CAM_LONG_LIMITS;
} else {
}

#ifdef ALLOW_DEBUG
Expand Down
25 changes: 10 additions & 15 deletions board/safety/safety_hyundai.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,19 +49,16 @@ static uint8_t hyundai_get_counter(const CANPacket_t *to_push) {
uint8_t cnt = 0;
if (addr == 0x260) {
cnt = (GET_BYTE(to_push, 7) >> 4) & 0x3U;
}
if (addr == 0x386) {
} else if (addr == 0x386) {
cnt = ((GET_BYTE(to_push, 3) >> 6) << 2) | (GET_BYTE(to_push, 1) >> 6);
}
if (addr == 0x394) {
} else if (addr == 0x394) {
cnt = (GET_BYTE(to_push, 1) >> 5) & 0x7U;
}
if (addr == 0x421) {
} else if (addr == 0x421) {
cnt = GET_BYTE(to_push, 7) & 0xFU;
}
if (addr == 0x4F1) {
} else if (addr == 0x4F1) {
cnt = (GET_BYTE(to_push, 3) >> 4) & 0xFU;
}
} else {
}
return cnt;
}

Expand All @@ -71,15 +68,13 @@ static uint32_t hyundai_get_checksum(const CANPacket_t *to_push) {
uint8_t chksum = 0;
if (addr == 0x260) {
chksum = GET_BYTE(to_push, 7) & 0xFU;
}
if (addr == 0x386) {
} else if (addr == 0x386) {
chksum = ((GET_BYTE(to_push, 7) >> 6) << 2) | (GET_BYTE(to_push, 5) >> 6);
}
if (addr == 0x394) {
} else if (addr == 0x394) {
chksum = GET_BYTE(to_push, 6) & 0xFU;
}
if (addr == 0x421) {
} else if (addr == 0x421) {
chksum = GET_BYTE(to_push, 7) >> 4;
} else {
}
return chksum;
}
Expand Down
5 changes: 3 additions & 2 deletions board/safety/safety_hyundai_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,9 +118,10 @@ uint32_t hyundai_common_canfd_compute_checksum(const CANPacket_t *to_push) {

if (len == 24) {
crc ^= 0x819dU;
}
if (len == 32) {
} else if (len == 32) {
crc ^= 0x9f5bU;
} else {

}

return crc;
Expand Down
16 changes: 7 additions & 9 deletions board/safety/safety_volkswagen_mqb.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,19 +45,17 @@ static uint32_t volkswagen_mqb_compute_crc(const CANPacket_t *to_push) {
uint8_t counter = volkswagen_mqb_get_counter(to_push);
if (addr == MSG_LH_EPS_03) {
crc ^= (uint8_t[]){0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,0xF5}[counter];
}
if (addr == MSG_ESP_05) {
} else if (addr == MSG_ESP_05) {
crc ^= (uint8_t[]){0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07}[counter];
}
if (addr == MSG_TSK_06) {
} else if (addr == MSG_TSK_06) {
crc ^= (uint8_t[]){0xC4,0xE2,0x4F,0xE4,0xF8,0x2F,0x56,0x81,0x9F,0xE5,0x83,0x44,0x05,0x3F,0x97,0xDF}[counter];
}
if (addr == MSG_MOTOR_20) {
} else if (addr == MSG_MOTOR_20) {
crc ^= (uint8_t[]){0xE9,0x65,0xAE,0x6B,0x7B,0x35,0xE5,0x5F,0x4E,0xC7,0x86,0xA2,0xBB,0xDD,0xEB,0xB4}[counter];
}
if (addr == MSG_GRA_ACC_01) {
} else if (addr == MSG_GRA_ACC_01) {
crc ^= (uint8_t[]){0x6A,0x38,0xB4,0x27,0x22,0xEF,0xE1,0xBB,0xF8,0x80,0x84,0x49,0xC7,0x9E,0x1E,0x2B}[counter];
}
} else {
// Undefined CAN message, CRC check expected to fail
}
crc = volkswagen_crc8_lut_8h2f[crc];

return (uint8_t)(crc ^ 0xFFU);
Expand Down
4 changes: 2 additions & 2 deletions board/safety/safety_volkswagen_pq.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@ static uint8_t volkswagen_pq_get_counter(const CANPacket_t *to_push) {

if (addr == MSG_LENKHILFE_3) {
counter = (uint8_t)(GET_BYTE(to_push, 1) & 0xF0U) >> 4;
}
if (addr == MSG_GRA_NEU) {
} else if (addr == MSG_GRA_NEU) {
counter = (uint8_t)(GET_BYTE(to_push, 2) & 0xF0U) >> 4;
} else {
}

return counter;
Expand Down
35 changes: 20 additions & 15 deletions tests/libpanda/SConscript
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
import os
import platform

COVERAGE_FLAGS = [
'-fprofile-instr-generate',
'-fcoverage-mapping',
]
CC = 'gcc'
system = platform.system()
if system == 'Darwin':
# gcc installed by homebrew has version suffix (e.g. gcc-12) in order to be
# distinguishable from system one - which acts as a symlink to clang
CC += '-13'

env = Environment(
CC='clang',
CC=CC,
CFLAGS=[
'-nostdlib',
'-fno-builtin',
Expand All @@ -17,19 +18,14 @@ env = Environment(
],
CPPPATH=[".", "../../board/"],
)
if platform.system() == "Darwin":
if system == "Darwin":
env.PrependENVPath('PATH', '/opt/homebrew/bin')

TICI = os.path.isfile('/TICI')
AGNOS = TICI
if AGNOS:
env['CC'] = 'gcc'
else:
env['CFLAGS'] += COVERAGE_FLAGS
env['LINKFLAGS'] += COVERAGE_FLAGS

if GetOption('mutation'):
env['CC'] = 'clang-17'
flags = [
'-fprofile-instr-generate',
'-fcoverage-mapping',
'-fpass-plugin=/usr/lib/mull-ir-frontend-17',
'-g',
'-grecord-command-line',
Expand All @@ -47,3 +43,12 @@ if GetOption('ubsan'):

panda = env.SharedObject("panda.os", "panda.c")
libpanda = env.SharedLibrary("libpanda.so", [panda])

if GetOption('coverage'):
env.Append(
CFLAGS=["-fprofile-arcs", "-ftest-coverage", "-fprofile-abs-path",],
LIBS=["gcov"],
)
# GCC note file is generated by compiler, ensure we build it, and allow scons to clean it up
AlwaysBuild(panda)
env.SideEffect("panda.gcno", panda)
28 changes: 14 additions & 14 deletions tests/safety/test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,31 +4,31 @@ set -e
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
cd $DIR

rm -f safety_*.profraw safety.profdata
scons -j$(nproc) -D
# reset coverage data and generate gcc note file
rm -f ../libpanda/*.gcda
scons -j$(nproc) -D --coverage

# run safety tests and generate coverage data
HW_TYPES=( 6 9 )
for hw_type in "${HW_TYPES[@]}"; do
echo "Testing HW_TYPE: $hw_type"
LLVM_PROFILE_FILE="safety_%m.profraw" HW_TYPE=$hw_type pytest test_*.py
HW_TYPE=$hw_type pytest test_*.py
done

# generate coverage report
llvm-profdata-17 merge -sparse safety_*.profraw -o safety.profdata

# open html report
# generate and open report
if [ "$1" == "--report" ]; then
llvm-cov-17 show -format=html -show-branches=count -instr-profile=safety.profdata ../libpanda/libpanda.so -sources ../../board/safety/safety_*.h ../../board/safety.h -o coverage_report
sensible-browser coverage_report/index.html
geninfo ../libpanda/ -o coverage.info
genhtml coverage.info -o coverage-out
sensible-browser coverage-out/index.html
fi

# test line coverage
INCOMPLETE_COVERAGE=$(llvm-cov-17 report -show-region-summary=false -show-branch-summary=false -instr-profile=safety.profdata ../libpanda/libpanda.so -sources ../../board/safety/safety_*.h ../../board/safety.h | awk '$7 != "100.00%"' | head -n -1)
if [ ! $(echo "$INCOMPLETE_COVERAGE" | wc -l) -eq 2 ]; then
echo "FAILED: Some files have less than 100% line coverage:"
# test coverage
GCOV_OUTPUT=$(gcov -n ../libpanda/panda.c)
INCOMPLETE_COVERAGE=$(echo "$GCOV_OUTPUT" | paste -s -d' \n' | grep -E "File.*(safety\/safety_.*)|(safety)\.h" | grep -v "100.00%" || true)
if [ -n "$INCOMPLETE_COVERAGE" ]; then
echo "FAILED: Some files have less than 100% coverage:"
echo "$INCOMPLETE_COVERAGE"
exit 1
else
echo "SUCCESS: All checked files have 100% line coverage!"
echo "SUCCESS: All checked files have 100% coverage!"
fi

0 comments on commit b6644f7

Please sign in to comment.