[cfe-dev] Implementing linux randstruct plugin for clang?

Friedman, Eli via cfe-dev cfe-dev at lists.llvm.org
Fri Sep 22 12:05:19 PDT 2017


On 9/22/2017 8:49 AM, Vlad Tsyrklevich wrote:
> I thought a little about implementing PAX_RANDSTRUCT for clang a 
> couple months back but I didn't get to the point where I implemented 
> anything. My notes indicate that my two ideas at the time I left it 
> were: (1) see if there's a point between parsing and codegen that a 
> clang plugin could insert a TreeTransform to rewrite struct 
> definitions, or (2) perform randomization as an LLVM pass that 
> rewrites types and the GEPs, GVs, etc. referencing those types.
>
> For approach #2 you would need to hook into offsetof()--Linux defines 
> offsetof() as both __builtin_offsetof() and ((size_t) &((TYPE 
> *)0)->MEMBER) in different places. The latter would transform into a 
> GEP and shouldn't require special casing, while the former might mean 
> it's not doable as an LLVM pass alone. Thinking about it now, if you 
> wanted to implement the unoptimized version of RANDSTRUCT (where 
> elements are randomized across cache lines) you would also need to 
> hook into sizeof() as well. I might be missing other code constructs 
> that would further complicate the pass approach.

The very latest point you can reorder the members of a struct without 
imposing weird restrictions is in RecordLayoutBuilder (which is run as 
part of semantic analysis). After that, constant-folding of 
sizeof/offsetof/etc. starts happening.

-Eli

-- 
Employee of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project




More information about the cfe-dev mailing list