aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChad Rosier <mcrosier@apple.com>2012-02-29 20:14:59 +0000
committerChad Rosier <mcrosier@apple.com>2012-02-29 20:14:59 +0000
commitb1cfc6864f8cd76494e2ccab4debe4a0471f47d3 (patch)
treee0974caecfed6af938699c73bc5f5c559102e13f
parent1692b901303d6f941fe5246f8a5885f2c83afc9b (diff)
downloadllvm-b1cfc6864f8cd76494e2ccab4debe4a0471f47d3.zip
llvm-b1cfc6864f8cd76494e2ccab4debe4a0471f47d3.tar.gz
llvm-b1cfc6864f8cd76494e2ccab4debe4a0471f47d3.tar.bz2
Allocate TargetLibraryInfo for the CodeGen passes. Otherwise, it's instantiated
by the BAA pass, which uses the default TargetLibraryInfo constructor. Unfortunately, the default TargetLibraryInfo constructor assumes all library calls are available and thus ignores -fno-builtin. rdar://10947759 llvm-svn: 151745
-rw-r--r--clang/lib/CodeGen/BackendUtil.cpp6
-rw-r--r--clang/test/CodeGen/libcalls-fno-builtin.c27
2 files changed, 33 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp
index d175bd5..d9bdc32 100644
--- a/clang/lib/CodeGen/BackendUtil.cpp
+++ b/clang/lib/CodeGen/BackendUtil.cpp
@@ -351,6 +351,12 @@ bool EmitAssemblyHelper::AddEmitPasses(BackendAction Action,
// Create the code generator passes.
PassManager *PM = getCodeGenPasses();
+ // Add LibraryInfo.
+ TargetLibraryInfo *TLI = new TargetLibraryInfo();
+ if (!CodeGenOpts.SimplifyLibCalls)
+ TLI->disableAllFunctions();
+ PM->add(TLI);
+
// Normal mode, emit a .s or .o file by running the code generator. Note,
// this also adds codegenerator level optimization passes.
TargetMachine::CodeGenFileType CGFT = TargetMachine::CGFT_AssemblyFile;
diff --git a/clang/test/CodeGen/libcalls-fno-builtin.c b/clang/test/CodeGen/libcalls-fno-builtin.c
new file mode 100644
index 0000000..41f0b38
--- /dev/null
+++ b/clang/test/CodeGen/libcalls-fno-builtin.c
@@ -0,0 +1,27 @@
+// RUN: %clang_cc1 -S -O3 -fno-builtin -o - %s | FileCheck %s
+
+double ceil(double x);
+double copysign(double,double);
+double cos(double x);
+double fabs(double x);
+double floor(double x);
+
+double t1(double x) { return ceil(x); }
+// CHECK: t1
+// CHECK: ceil
+
+double t2(double x, double y) { return copysign(x,y); }
+// CHECK: t2
+// CHECK: copysign
+
+double t3(double x) { return cos(x); }
+// CHECK: t3
+// CHECK: cos
+
+double t4(double x) { return fabs(x); }
+// CHECK: t4
+// CHECK: fabs
+
+double t5(double x) { return floor(x); }
+// CHECK: t5
+// CHECK: floor