Strange error after doing transformation on IR level


I met a very strange error after transforming IR code.

What I did is that I create a function and insert it into the original program’s IR code.

I use following command to load my pass and generate the transformed bytecode (the “result”).

opt -load ~/mypass/ -insert < mytestcode.ll > result

Then, I try to compile it to assembly code via llc
llc result

After that, the error occurs:
llc: result:1:1: error: expected top-level entity

It seems like the error is about the IR code.
Thus, I dump the module during my pass, it turns out that there is only one line different:

  1. when I just open the IR code - mytestcode.ll, the first line is:
    ; ModuleID = ‘./mytestcode.c’

  2. when I dump it during my pass, the first line is:
    ; ModuleID = ‘’

The strange thing is, after transformation by my pass, I also dump the transformed module, and copy all the dumped content to a file, and then, perform “llc” on it. Surprisingly, I found It works well. I also compile it to an executable and run it. The result is correct for my transformation.

Thus, I’m so confused about:

  1. what the different between “; ModuleID = ‘./mytestcode.c’” and “; ModuleID = ‘’”. Will it impact the “llc” and trigger the error?

  2. when I read the module during my pass, why the ModuleID has been changed from ‘./mytestcode.c’ to ‘’

  3. why does the error “llc: result:1:1: error: expected top-level entity” happen, and why does the IR code dumped during my pass work well?

Thanks in advance!


The reason the module name is is because you used input redirection via “< mytestcode.ll” on your command line. This means the shell opened the file and sent it through stdin. Opt never saw your file name. I’m not sure, but the output redirection “> result” may also be keep llc from reading the file. Try this to read and write your file

opt -load ~/mypass/ -insert mytestcode.ll -o result.bc

llc result.bc