When a function template instance is called, it is called indirectly, likely
due to being "weak" function (arm.c:arm_encode_section_info).

However when the same call is subject of a tail call optimization, it is called
directly. 

The function is also called directly when there is no function template
definition visible in the source, e.g. when old style template organization
makes template definitions visible in a single source file only.

What is the reasoning behind the distinction between between weak and normal
functions made in arm.c:arm_encode_section_info? It falls a bit short because
it treats function calls inconsistently, depending on the visibility of their
definition. And while it could simply be treated as a bug in the tail call
optimization, I'd rather suggest to not treat "weak" functions differently,
because (1) efficiency of template based code is greatly affected and (2) I can
see little reason to use long-calls for known "weak" functions but short-calls
for all other external functions including those which are not yet known to be
"weak".

Invocation:
  arm-elf-gcc -O2 -S source.cpp

Sample code:

template<class T> class Q {
public:
    Q();
    void f ();
};

// called directly if this definition is removed.
template<class T> void Q<T>::f() { }

class U {
public:
    int g();
    Q<char>& rx;
};

int U::g()
{
    rx.f(); // indirect call is used
    rx.f(); // turned into direct call by tail call optimization
}


-- 
           Summary: inconsistent code for template function calls
           Product: gcc
           Version: 4.0.1
            Status: UNCONFIRMED
          Severity: minor
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: a dot kaiser at gmx dot net
GCC target triplet: arm-elf


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25249

Reply via email to