[llvm-commits] CVS: llvm/lib/CWriter/CTargetMachine.h Writer.cpp

Chris Lattner lattner at cs.uiuc.edu
Fri Feb 13 17:19:01 PST 2004


Changes in directory llvm/lib/CWriter:

CTargetMachine.h added (r1.1)
Writer.cpp updated: 1.157 -> 1.158

---
Log message:

Convert the C backend into a target, for use with LLC.  This allows us to use
the lowerallocations pass to eliminate malloc/free warnings and hackish code


---
Diffs of the changes:  (+51 -30)

Index: llvm/lib/CWriter/CTargetMachine.h
diff -c /dev/null llvm/lib/CWriter/CTargetMachine.h:1.1
*** /dev/null	Fri Feb 13 17:18:58 2004
--- llvm/lib/CWriter/CTargetMachine.h	Fri Feb 13 17:18:48 2004
***************
*** 0 ****
--- 1,39 ----
+ //===-- CTargetMachine.h - TargetMachine for the C backend ------*- C++ -*-===//
+ // 
+ //                     The LLVM Compiler Infrastructure
+ //
+ // This file was developed by the LLVM research group and is distributed under
+ // the University of Illinois Open Source License. See LICENSE.TXT for details.
+ // 
+ //===----------------------------------------------------------------------===//
+ // 
+ // This file declares the TargetMachine that is used by the C backend.
+ //
+ //===----------------------------------------------------------------------===//
+ 
+ #ifndef CTARGETMACHINE_H
+ #define CTARGETMACHINE_H
+ 
+ #include "llvm/Target/TargetMachine.h"
+ 
+ namespace llvm {
+ class IntrinsicLowering;
+ 
+ struct CTargetMachine : public TargetMachine {
+   CTargetMachine(const Module &M, IntrinsicLowering *IL) :
+     TargetMachine("CBackend", IL) {}
+ 
+   virtual const TargetInstrInfo &getInstrInfo() const { abort(); }
+   virtual const TargetFrameInfo &getFrameInfo() const { abort(); }
+   virtual const TargetSchedInfo &getSchedInfo() const { abort(); }
+   virtual const TargetRegInfo   &getRegInfo()   const { abort(); }
+   virtual const TargetCacheInfo &getCacheInfo() const { abort(); }
+ 
+   // This is the only thing that actually does anything here.
+   virtual bool addPassesToEmitAssembly(PassManager &PM, std::ostream &Out);
+ };
+ 
+ } // End llvm namespace
+ 
+ 
+ #endif


Index: llvm/lib/CWriter/Writer.cpp
diff -u llvm/lib/CWriter/Writer.cpp:1.157 llvm/lib/CWriter/Writer.cpp:1.158
--- llvm/lib/CWriter/Writer.cpp:1.157	Fri Feb 13 17:00:29 2004
+++ llvm/lib/CWriter/Writer.cpp	Fri Feb 13 17:18:48 2004
@@ -12,7 +12,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "llvm/Assembly/CWriter.h"
+#include "CTargetMachine.h"
+#include "llvm/Target/TargetMachineImpls.h"
 #include "llvm/Constants.h"
 #include "llvm/DerivedTypes.h"
 #include "llvm/Module.h"
@@ -42,7 +43,6 @@
 
     std::map<const Type *, std::string> TypeNames;
     std::set<const Value*> MangledGlobals;
-    bool needsMalloc;
 
     std::map<const ConstantFP *, unsigned> FPConstantMap;
   public:
@@ -669,7 +669,6 @@
   // Function declarations
   if (!M.empty()) {
     Out << "\n/* Function Declarations */\n";
-    needsMalloc = true;
     for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) {
       // If the function is external and the name collides don't print it.
       // Sometimes the bytecode likes to have multiple "declarations" for
@@ -684,12 +683,6 @@
     }
   }
 
-  // Print Malloc prototype if needed
-  if (needsMalloc) {
-    Out << "\n/* Malloc to make sun happy */\n";
-    Out << "extern void * malloc();\n\n";
-  }
-
   // Output the global variable declarations
   if (!M.gempty()) {
     Out << "\n\n/* Global Variable Declarations */\n";
@@ -873,11 +866,6 @@
 
 
 void CWriter::printFunctionSignature(const Function *F, bool Prototype) {
-  // If the program provides its own malloc prototype we don't need
-  // to include the general one.  
-  if (Mang->getValueName(F) == "malloc")
-    needsMalloc = false;
-
   if (F->hasInternalLinkage()) Out << "static ";
   if (F->hasLinkOnceLinkage()) Out << "inline ";
   
@@ -1264,17 +1252,7 @@
 }  
 
 void CWriter::visitMallocInst(MallocInst &I) {
-  Out << "(";
-  printType(Out, I.getType());
-  Out << ")malloc(sizeof(";
-  printType(Out, I.getType()->getElementType());
-  Out << ")";
-
-  if (I.isArrayAllocation()) {
-    Out << " * " ;
-    writeOperand(I.getOperand(0));
-  }
-  Out << ")";
+  assert(0 && "lowerallocations pass didn't work!");
 }
 
 void CWriter::visitAllocaInst(AllocaInst &I) {
@@ -1291,9 +1269,7 @@
 }
 
 void CWriter::visitFreeInst(FreeInst &I) {
-  Out << "free((char*)";
-  writeOperand(I.getOperand(0));
-  Out << ")";
+  assert(0 && "lowerallocations pass didn't work!");
 }
 
 void CWriter::printIndexingExpression(Value *Ptr, gep_type_iterator I,
@@ -1394,8 +1370,14 @@
 //                       External Interface declaration
 //===----------------------------------------------------------------------===//
 
-void llvm::AddPassesToWriteC(PassManager &PM, std::ostream &o) {
+bool CTargetMachine::addPassesToEmitAssembly(PassManager &PM, std::ostream &o) {
+  PM.add(createLowerAllocationsPass());
   PM.add(createLowerInvokePass());
-  //PM.add(createLowerAllocationsPass());
   PM.add(new CWriter(o));
+  return false;
+}
+
+TargetMachine *llvm::allocateCTargetMachine(const Module &M,
+                                            IntrinsicLowering *IL) {
+  return new CTargetMachine(M, IL);
 }





More information about the llvm-commits mailing list