old-cross-binutils/gold/testsuite/debug_msg.cc
H.J. Lu bd040da1db Change SometimesInlineFunction to "return i * i * 3;"
The debug_msg test has 2 implementations of SometimesInlineFunction:

int SometimesInlineFunction(int i) { return i; }
int SometimesInlineFunction(int i) { return i * i; }

and One Definition Rule (ODR) violation detection expects they will be
compiled into functions of different sizes.  Hower, on x86, GCC 4.7 and
newer compile them into functions of the same size and ODR violation
detection test fails.  This patch changes

int SometimesInlineFunction(int i) { return i; }

to

int SometimesInlineFunction(int i) { return i * i * 3; }

so that it will be compiled into a function of larger size.

	PR gold/14608
	* testsuite/debug_msg.cc (SometimesInlineFunction): Changed
	to "return i * i * 3;".
2014-12-20 08:05:45 -08:00

96 lines
2.5 KiB
C++

// debug_msg.cc -- a test case for printing debug info for missing symbols.
// Copyright (C) 2006-2014 Free Software Foundation, Inc.
// Written by Ian Lance Taylor <iant@google.com>.
// This file is part of gold.
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3 of the License, or
// (at your option) any later version.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
// MA 02110-1301, USA.
// This file is constructed to have undefined references. In
// debug_msg.sh, we will try to link this file, and analyze the
// error messages that are produced.
extern int undef_int;
extern float undef_float;
extern void undef_fn1();
extern void undef_fn2();
int* badref1 = &undef_int;
static float* badref2 = &undef_float;
void (*fn_array[])() =
{
undef_fn1,
undef_fn2
};
template<class Foo>
int testfn(Foo x)
{
undef_fn1();
undef_fn2();
return undef_int;
}
class Base
{
virtual void virtfn() { undef_fn1(); }
};
class Derived : public Base
{
virtual void virtfn() { undef_fn2(); }
};
// This tests One Definition Rule (ODR) violations.
void SortAscending(int array[], int size); // in odr_violation1.cc
void SortDescending(int array[], int size); // in odr_violation2.cc
// This tests One Definition Rule (ODR) non-violations.
#include "odr_header2.h"
OdrBase* CreateOdrDerived1(); // in odr_violation1.cc
OdrBase* CreateOdrDerived2(); // in odr_violation2.cc
extern "C" int OverriddenCFunction(int i); // in odr_violation*.cc
inline int SometimesInlineFunction(int i) { // strong in odr_violation2.cc.
return i * i * 3;
}
int main()
{
testfn(5);
testfn(4.0);
Base b;
Derived d;
int kInput1[] = {1, 6, 9, 7, 3, 4, 2, 10, 5, 8};
int kSize1 = sizeof(kInput1) / sizeof(int);
SortAscending(kInput1, kSize1);
int kInput2[] = {1, 6, 9, 7, 3, 4, 2, 10, 5, 8};
int kSize2 = sizeof(kInput2) / sizeof(int);
SortDescending(kInput2, kSize2);
OverriddenCFunction(3);
SometimesInlineFunction(3);
delete CreateOdrDerived1();
delete CreateOdrDerived2();
return 0;
}