[llvm-dev] List of alias analyses available in LLVM, and how to use them from llc

Ethan J. Johnson via llvm-dev llvm-dev at lists.llvm.org
Mon Jul 3 15:51:15 PDT 2017


Hi all,

I have two questions about alias analysis; see below for the background 
on why I am asking these questions. First, the questions:

 1. Is there an up-to-date list somewhere of all the alias analyses in
    LLVM, and what their capabilities are? I've been told that the
    AliasAnalysis page in the official documentation
    (http://llvm.org/docs/AliasAnalysis.html) is severely out of date. I
    see in particular that it makes no mention of e.g. TBAA, which shows
    up in "opt -help".
 2. Is it possible to override the default alias analysis implementation
    when running the "llc" tool (or from clang)? I am working from
    within a MachineFunctionPass, so (unfortunately) I cannot use "opt",
    which would provide easy command-line options to do this. If there
    is no command-line ability to specify a different alias analysis,
    how could I do so in code? Presently, I am simply using
    getAnalysis<AliasAnalysis>() to get the default alias analysis,
    which is BasicAA.

Now for the background:

I am writing an analysis pass at the machine-IR level 
(MachineFunctionPass) for security research. (Before anyone asks, yes, 
we've considered doing this in regular IR, and it isn't sufficient for 
our needs. :-) We are studying code-reuse attacks and need to examine 
the actual machine instructions available to an attacker in the final 
compiled binary.)

I'm currently exploring the use of IR-level alias analysis information 
in my MachineFunctionPass. Specifically, I'm using AliasSetTracker on 
the Value* pointers returned by MachineMemOperand::getValue() (similar 
to what MachineInstr::mayAlias() does, though we're not using that 
interface because we're interested in alias sets).

So far, I've been using BasicAliasAnalysis's results, since they're the 
default that I get when simply using getAnalysis<AliasAnalysis>(). 
However, I'd like to try some more advanced alias analyses. 
Specifically, I'm looking for something that provides better 
field-sensitivity within structs on the stack. BasicAA is 
field-sensitive in general but I've observed that this has trouble 
distinguishing between (for instance) scalar and array fields within the 
same struct when the array is accessed through a variable index. A 
simple motivating example of this is:

struct mystruct {
     short s;
     int i;
     int arr[5];
};

struct mystruct str;
str.s = (short) rand();
str.i = rand();
for (int idx = 0; idx < 5; ++idx){
     str.arr[idx] = rand();
}

printf("%hd %d %d %d %d %d %d", str.s, str.i, str.arr[0], str.arr[1], 
str.arr[2], str.arr[3], str.arr[4]);

For the above code, BasicAA knows that str.s, str.i, and str.arr[0-4] 
are all pairwise NoAlias, but it says that they are all PartialAlias 
with str.arr[idx]. Clearly, this is because idx is a variable with 
unknown value, and it doesn't fall into one the "special cases" that 
BasicAA can recognize as NoAlias. (For instance, if I write 
str.arr[(unsigned)idx] instead, it can figure out that it is NoAlias 
with str.s, since the explicit zero-extension lets BasicAA know that the 
index **must** be positive, and they are far enough apart that they 
can't alias. Oddly, it still thinks str.i is PartialAlias...I haven't 
figured this one out but would guess it somehow slips through the cracks 
of BasicAA's special cases.)

Having an array alongside scalars in a struct is fairly common, and I'd 
like to not have to sacrifice field sensitivity when it occurs. My 
thinking, therefore, is that I need a smarter AA that knows things about 
types, e.g., that it's undefined behavior to access a scalar struct 
field through an out-of-bounds pointer to an array field in the same 
struct. This sounds like the sort of thing TBAA ("Type-Based Alias 
Analysis") might be able to do - hence my questions above.

Thanks in advance for your time and assistance!

Sincerely,
Ethan Johnson

-- 
Ethan J. Johnson
Computer Science PhD student, Systems group, University of Rochester
ejohns48 at cs.rochester.edu
ethanjohnson at acm.org
PGP public key available from public directory or on request

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170703/5f10c983/attachment.html>


More information about the llvm-dev mailing list