Testing canaries

Dear LLVMers,

I am trying to measure the performance overhead (if any) of the canaries that clang inserts in the code. I would like to do this automatically, using the LLVM test infra-structure. However, I am not sure if that is possible. Could someone tell me which flags in the TEST.nightly.Makefile script, (or any other script) I must change to have this done? Usually I insert canaries with the following command line:

$> clang -S -fstack-protector hello.c

But I would like to know which part of LLVM calls the pass that inserts the canaries. It seems it is llc, as the pass that inserts the canaries is in /lib/CodeGen/StackProtector.cpp. Yet, I cannot see ‘fstack-protector’ in the llc --help list, although I can see ‘stack-protector-buffer-size’ in llc --help.

Sincerely,

Hi Izabela,

Dear LLVMers,

     I am trying to measure the performance overhead (if any) of the canaries
that clang inserts in the code. I would like to do this automatically, using the
LLVM test infra-structure. However, I am not sure if that is possible. Could
someone tell me which flags in the TEST.nightly.Makefile script, (or any other
script) I must change to have this done? Usually I insert canaries with the
following command line:

$> clang -S -fstack-protector hello.c

But I would like to know which part of LLVM calls the pass that inserts the
canaries. It seems it is llc, as the pass that inserts the canaries is in
/lib/CodeGen/StackProtector.cpp. Yet, I cannot see 'fstack-protector' in the llc
--help list, although I can see 'stack-protector-buffer-size' in llc --help.

the -fstack-protector option is processed by the clang front-end. If you grep
for stack-protector in the clang source, you will discover that the action is
happening in clang/lib/Driver/Tools.cpp, here:

   if (StackProtectorLevel) {
     CmdArgs.push_back("-stack-protector");
     CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
   }

The argument -stack-protector is for the code generators, and you should find
that llc has the same argument. However if you look for it it doesn't seem to
exist:

$ llc -help | grep stack-protector
   -stack-protector-buffer-size=<uint> - Lower bound for a buffer to be considered for stack protection

What is going on? Some options aren't considered generally useful and are
hidden. If you use -help-hidden you get to see all options:

$ llc -help-hidden | grep stack-protector
     =stack-protector - Insert stack protectors
   -stack-protector-buffer-size=<uint> - Lower bound for a buffer to be considered for stack protection

There it is! It's not clear to me why -stack-protector is hidden away like
that. Hidden options work just the same as visible options: just pass
-stack-protector to llc.

Ciao, Duncan.