Michael137 wrote:

> > My understanding was that the DIExpression parameter to 
> > DIGlobalVariableExpression was empty for global variables with locations. 
> > So the patch just encodes the constant into that expression if it's 
> > otherwise empty.
> 
> I think in theory it can be non-empty (see what happens under a merge globals 
> optimization... I'm not sure of an example of when this optimization fires, 
> or what the debug info we emit looks like - in theory it should look like a 
> global with a non-empty expression that describes offsetting the pointer 
> forward to reach the global inside the merged global) & so then you'd have a 
> hard time telling whether the expression is meant to be used in addition to 
> the location, or as part of evaluating the location.
> 
> We don't really have a mechanism for encoding a variable in two locations (or 
> a constant and a location) at the same time, I think. We could invent a 
> special opcode to use in the expression to communicate this, or define some 
> special handling if there's two separate expressions providing a location (or 
> a location and a constant in this case) for the same variable (say that 
> they're both valid, and emit them both if we can).
> 
> @adrian-prantl thoughts?

Thanks for the pointers. The closest I could get to triggering a GlobalMerge of 
const static data-members was for following code:
```
struct Foo {
    static const int a;
    static const int b;
};

const int Foo::a = 100;
const int Foo::b = 200;
```

But only if I mark the constants as `internal` in the IR as follows (I attached 
the whole file):
```
%struct.Foo = type { i8 }

@a = internal constant i32 100, align 4, !dbg !0
@b = internal constant i32 200, align 4, !dbg !5

define void @use1() {
  %x = load i32, ptr @a, align 4
  %y = load i32, ptr @b, align 4
  ret void
}
...
```

Then run `opt` as:
```
./bin/opt  -global-merge -global-merge-max-offset=100 -global-merge-on-const -S 
merge.ll
```

That changes the IR into:
```
...
@_MergedGlobals = private constant <{ i32, i32 }> <{ i32 100, i32 200 }>, align 
4, !dbg !0, !dbg !13

@a = internal alias i32, ptr @_MergedGlobals
@b = internal alias i32, getelementptr inbounds (<{ i32, i32 }>, ptr 
@_MergedGlobals, i32 0, i32 1)
...
!1 = distinct !DIGlobalVariable(name: "a", linkageName: "_ZN3Foo1aE", scope: 
!2, file: !3, line: 6, type: !7, isLocal: false, isDefinition: true, 
declaration: !12)
...
!5 = !DIGlobalVariableExpression(var: !6, expr: !DIExpression())
!6 = distinct !DIGlobalVariable(name: "b", linkageName: "_ZN3Foo1bE", scope: 
!2, file: !3, line: 7, type: !7, isLocal: false, isDefinition: true, 
declaration: !9)
...
!13 = !DIGlobalVariableExpression(var: !6, expr: 
!DIExpression(DW_OP_plus_uconst, 4))
```

https://github.com/llvm/llvm-project/pull/72730
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to