[LLVMdev] CodeExtractor doesn't work with debugging metadata

Rudderham, Stuart stuart.rudderham at intel.com
Wed Nov 14 14:39:55 PST 2012


Hi,

I've been experimenting with the CodeExtractor class and have been running into a problem where the verifier pass fails with the error "function-local metadata used in wrong function" when I compile with debugging symbols enabled (-g flag). The issue seems to be that after extraction we have metadata that references variables that aren't allocated in the extracted function. Example IR is below. Is this intentional or a bug?

Original IR
      define i32 @Fn() nounwind {
          %a = alloca i32, align 4
          ...
          call void @llvm.dbg.declare(metadata !{i32* %a}, metadata !15), !dbg !14
          %call = call i32 @Foo(), !dbg !14
          store i32 %call, i32* %a, align 4, !dbg !14

After Extraction
      define i32 @Fn() nounwind {
      entry:
          %a = alloca i32, align 4
          ...
          call void @extractedFn(i32* %a)

      define internal void @extractedFn(i32* %a) noinline {
      newFuncRoot:
          call void @llvm.dbg.declare(metadata !{i32* %a}, metadata !19), !dbg !14		;; metadata now references variable not allocated in this function
          %call = call i32 @Foo(), !dbg !14
          store i32 %call, i32* %a, align 4, !dbg !14


Thanks,
Stuart Rudderham




More information about the llvm-dev mailing list