Home | History | Annotate | Download | only in CodeGenCXX
      1 // RUN: %clang_cc1 -g -triple %itanium_abi_triple -emit-llvm -o - %s | FileCheck %s
      2 
      3 // Make sure that clang outputs distinct debug info for a function
      4 // that is inlined twice on the same line. Otherwise it would appear
      5 // as if the function was only inlined once.
      6 
      7 #define INLINE inline __attribute__((always_inline))
      8 
      9 int i;
     10 
     11 INLINE void sum(int a, int b) {
     12   i = a + b;
     13 }
     14 
     15 void noinline(int x, int y) {
     16   i = x + y;
     17 }
     18 
     19 #define CALLS sum(9, 10), sum(11, 12)
     20 
     21 inline void inlsum(int t, int u) {
     22   i = t + u;
     23 }
     24 
     25 int main() {
     26   sum(1, 2), sum(3, 4);
     27   noinline(5, 6), noinline(7, 8);
     28   CALLS;
     29   inlsum(13, 14), inlsum(15, 16);
     30 }
     31 
     32 // CHECK-LABEL: @main
     33 // CHECK: = add {{.*}} !dbg [[FIRST_INLINE:![0-9]*]]
     34 // CHECK: = add {{.*}} !dbg [[SECOND_INLINE:![0-9]*]]
     35 
     36 // Check that we don't give column information (and thus end up with distinct
     37 // line entries) for two non-inlined calls on the same line.
     38 // CHECK: call {{.*}}noinline{{.*}}({{i32[ ]?[a-z]*}} 5, {{i32[ ]?[a-z]*}} 6), !dbg [[NOINLINE:![0-9]*]]
     39 // CHECK: call {{.*}}noinline{{.*}}({{i32[ ]?[a-z]*}} 7, {{i32[ ]?[a-z]*}} 8), !dbg [[NOINLINE]]
     40 
     41 // FIXME: These should be separate locations but because the two calls have the
     42 // same line /and/ column, they get coalesced into a single inlined call by
     43 // accident. We need discriminators or some other changes to LLVM to cope with
     44 // this. (this is, unfortunately, an LLVM test disguised as a Clang test - since
     45 // inlining is forced to happen here). It's possible this could be fixed in
     46 // Clang, but I doubt it'll be the right place for the fix.
     47 // CHECK: = add {{.*}} !dbg [[FIRST_MACRO_INLINE:![0-9]*]]
     48 // CHECK: = add {{.*}} !dbg [[FIRST_MACRO_INLINE]]
     49 
     50 // Even if the functions are marked inline but do not get inlined, they
     51 // shouldn't use column information, and thus should be at the same debug
     52 // location.
     53 // CHECK: call {{.*}}inlsum{{.*}}({{i32[ ]?[a-z]*}} 13, {{i32[ ]?[a-z]*}} 14), !dbg [[INL_FIRST:![0-9]*]]
     54 // CHECK: call {{.*}}inlsum{{.*}}({{i32[ ]?[a-z]*}} 15, {{i32[ ]?[a-z]*}} 16), !dbg [[INL_SECOND:![0-9]*]]
     55 
     56 // [[FIRST_INLINE]] =
     57 // [[SECOND_INLINE]] =
     58 
     59 // FIXME: These should be the same location since the functions appear on the
     60 // same line and were not inlined - they needlessly have column information
     61 // intended to disambiguate inlined calls, which is going to confuse GDB as it
     62 // doesn't cope well with column information.
     63 // [[INL_FIRST]] =
     64 // [[INL_SECOND]] =
     65