Hi,

I'm trying to understand how the escape analysis in IPA-PTA works. I was testing a hypothesis where if a structure contains an array of characters and this array of characters is passed to fopen, the structure and all subfields will escape.

To do this, I made a program that has a global structure variable foo2 that is has a field passed as an argument to fopen. I also made another variable foo whose array is initialized by the result of rand.

However, after compiling this program with -flto -flto-partition=none -fipa -fdump-ipa-pta -fdump-tree-all-all -Ofast (gcc --version 10.2.0)

E.g.

#include <stdio.h>
#include <math.h>
#include <string.h>

struct foo_t {
  char buffer1[100];
  char buffer2[100];
};

struct foo_t foo;
struct foo_t foo2;

int
main(int argc, char** argv)
{

  fopen(foo2.buffer1, "r");
  for (int i = 0; i < 100; i++)
  {
    foo.buffer1[i] = rand();
  }
  int i = rand();
  int retval = foo.buffer1[i % 100];
  return retval;
}

I see the PTA dump state the following:

ESCAPED = { STRING ESCAPED NONLOCAL foo2 }
foo = { ESCAPED NONLOCAL }
foo2 = { ESCAPED NONLOCAL }

which I understand as
* something externally visible might point to foo2
* foo2 might point to something externally visible
* foo might point to something externally visible

I have seen that global variables are stored in the .gnu.lto_.decls LTO file section. In the passes I have worked on I have ignored global variables. But can foo and foo2 be marked as escaping because the declarations are not streamed in yet? Or is there another reason I am not seeing? I am aware of aware of the several TODOs at the beginning of gcc/tree-ssa-structalias.c but I am unsure if they contribute to these variables being marked as escaping. (Maybe TODO 1 and TODO 2?)

Just FYI, I've been reading:
* Structure Aliasing in GCC
* Gimple Alias Improvements for GCC 4.5
* Memory SSA - A Unified Approach for Sparsely Representing Memory Operations

Thanks, I appreciate all help!

Reply via email to