Current relocation processing does:
if (the relocation expr belongs to category A) do something; if (the relocation expr belongs to category B) do something; if (the relocation expr belongs to category C) do something;
This refactor flattens it into
switch (expr) { case R_PC: case R_...: do something; case R_...: do something; ... }
which may potentially improve performance.
In addition, if some architectures have strange logic, we can add a new RelExpr member and make it interrupt less to the generic code.