Page MenuHomePhabricator

fix CO-RE incorrect index access string
ClosedPublic

Authored by yonghong-song on Jul 24 2019, 7:33 PM.

Details

Summary

Currently, we expect the CO-RE offset relocation records
a string encoding the original getelementptr access index,
so kernel bpf loader can decode it correctly.

For example,

struct s { int a; int b; };
struct t { int c; int d; };
#define _(x) (__builtin_preserve_access_index(x))
int get_value(const void *addr1, const void *addr2);
int test(struct s *arg1, struct t *arg2) {
  return get_value(_(&arg1->b), _(&arg2->d));
}

We expect two offset relocations:

reloc 1: type s, access index 0, 1
reloc 2: type t, access index 0, 1

Two globals are created to retain access indexes for the
above two relocations with global variable names.
The first global has a name "0:1:". Unfortunately,
the second global has the name "0:1:.1" as the llvm
internals automatically add suffix ".1" to a global
with the same name. Later on, the BPF peels the last
character and record "0:1" and "0:1:." in the
relocation table.

This is not desirable. BPF backend could use the global
variable suffix knowledge to generate correct access str.
This patch rather took an approach not relying on
that knowledge. It generates "s:0:1:" and "t:0:1:" to
avoid global variable suffixes and later on generate
correct index access string "0:1" for both records.

Diff Detail

Repository
rL LLVM

Event Timeline

yonghong-song created this revision.Jul 24 2019, 7:33 PM
Herald added a project: Restricted Project. · View Herald TranscriptJul 24 2019, 7:33 PM
ast accepted this revision.Jul 24 2019, 9:11 PM
This revision is now accepted and ready to land.Jul 24 2019, 9:11 PM
This revision was automatically updated to reflect the committed changes.