Add fmod() to the Module being compiled so that it gets a stub in the asm file
authorMisha Brukman <brukman+llvm@gmail.com>
Wed, 7 Jul 2004 15:36:18 +0000 (15:36 +0000)
committerMisha Brukman <brukman+llvm@gmail.com>
Wed, 7 Jul 2004 15:36:18 +0000 (15:36 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@14670 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/PowerPC/PPC32ISelSimple.cpp
lib/Target/PowerPC/PowerPCISelSimple.cpp

index b69f5c6f6d421a9c1d3d0f6062e2c1e5f9a4fbf2..edcfccbb3b76ba9685b9e0c3cb67848dfe3efcb7 100644 (file)
@@ -72,6 +72,7 @@ namespace {
   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 @@ namespace {
 
     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 @@ void ISel::emitDivRemOperation(MachineBasicBlock *BB,
     } 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));
index b69f5c6f6d421a9c1d3d0f6062e2c1e5f9a4fbf2..edcfccbb3b76ba9685b9e0c3cb67848dfe3efcb7 100644 (file)
@@ -72,6 +72,7 @@ namespace {
   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 @@ namespace {
 
     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 @@ void ISel::emitDivRemOperation(MachineBasicBlock *BB,
     } 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));