Add fmod() to the Module being compiled so that it gets a stub in the asm file


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@14670 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Target/PowerPC/PPC32ISelSimple.cpp b/lib/Target/PowerPC/PPC32ISelSimple.cpp
index b69f5c6..edcfccb 100644
--- a/lib/Target/PowerPC/PPC32ISelSimple.cpp
+++ b/lib/Target/PowerPC/PPC32ISelSimple.cpp
@@ -72,6 +72,7 @@
   struct ISel : public FunctionPass, InstVisitor<ISel> {
     TargetMachine &TM;
     MachineFunction *F;                 // The function we are compiling into
+    Module *M;                          // Current module
     MachineBasicBlock *BB;              // The current MBB we are compiling
     int VarArgsFrameIndex;              // FrameIndex for start of varargs area
     int ReturnAddressIndex;             // FrameIndex for the return address
@@ -87,10 +88,12 @@
 
     ISel(TargetMachine &tm) : TM(tm), F(0), BB(0) {}
 
-		bool doInitialization(Module &M) {
+		bool doInitialization(Module &Mod) {
+      M = &Mod;
+      // Add external functions that we may call
 			Type *d = Type::DoubleTy;
 			// double fmod(double, double);
-			// M.getOrInsertFunction("fmod", d, d, d, 0);
+			Mod.getOrInsertFunction("fmod", d, d, d, 0);
 			// { "__moddi3", "__divdi3", "__umoddi3", "__udivdi3" };
 			return false;
 		}
@@ -1946,8 +1949,10 @@
     } else {               // Floating point remainder...
       unsigned Op0Reg = getReg(Op0, BB, IP);
       unsigned Op1Reg = getReg(Op1, BB, IP);
+      Function *FmodFn = M->getNamedFunction("fmod");
+      assert(FmodFn && "fmod() does not exist in the module");
       MachineInstr *TheCall =
-        BuildMI(PPC32::CALLpcrel, 1).addExternalSymbol("fmod", true);
+        BuildMI(PPC32::CALLpcrel, 1).addGlobalAddress(FmodFn, true);
       std::vector<ValueRecord> Args;
       Args.push_back(ValueRecord(Op0Reg, Type::DoubleTy));
       Args.push_back(ValueRecord(Op1Reg, Type::DoubleTy));