Skip to content

Commit

Permalink
[ompd] Fix strict aliasing violation in TargetValue::getValue() (llvm…
Browse files Browse the repository at this point in the history
…#97739)

For the case where baseTypeSize does not match the size of T, read the
value into a separate char buffer first. This avoids accessing buf using
two different types.

Fixes llvm#94616.
  • Loading branch information
nikic authored Jul 5, 2024
1 parent eb7ebd5 commit 8101cbf
Showing 1 changed file with 21 additions and 16 deletions.
37 changes: 21 additions & 16 deletions openmp/libompd/src/TargetValue.h
Original file line number Diff line number Diff line change
Expand Up @@ -231,22 +231,27 @@ class TBaseValue : public TValue {

template <typename T> ompd_rc_t TBaseValue::getValue(T &buf) {
assert(sizeof(T) >= baseTypeSize);
ompd_rc_t ret = getValue(&buf, 1);
if (sizeof(T) > baseTypeSize) {
switch (baseTypeSize) {
case 1:
buf = (T) * ((int8_t *)&buf);
break;
case 2:
buf = (T) * ((int16_t *)&buf);
break;
case 4:
buf = (T) * ((int32_t *)&buf);
break;
case 8:
buf = (T) * ((int64_t *)&buf);
break;
}
if (sizeof(T) == baseTypeSize)
return getValue(&buf, 1);

char tmp[sizeof(T)];
ompd_rc_t ret = getValue(tmp, 1);
switch (baseTypeSize) {
case 1:
buf = (T) * ((int8_t *)tmp);
break;
case 2:
buf = (T) * ((int16_t *)tmp);
break;
case 4:
buf = (T) * ((int32_t *)tmp);
break;
case 8:
buf = (T) * ((int64_t *)tmp);
break;
default:
assert(0 && "Invalid baseTypeSize");
break;
}
return ret;
}
Expand Down

0 comments on commit 8101cbf

Please sign in to comment.