Properly support cstrings
authorNate Begeman <natebegeman@mac.com>
Mon, 29 Jan 2007 21:20:42 +0000 (21:20 +0000)
committerNate Begeman <natebegeman@mac.com>
Mon, 29 Jan 2007 21:20:42 +0000 (21:20 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33629 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/MachOWriter.h
lib/CodeGen/MachOWriter.cpp

index 0d13c909a94cd79664e20ec2858f38bff9cc25df..0de04c0407c8325bdfd60a8ca1a39886829b5406 100644 (file)
@@ -14,6 +14,7 @@
 #ifndef LLVM_CODEGEN_MACHOWRITER_H
 #define LLVM_CODEGEN_MACHOWRITER_H
 
+#include "llvm/Constants.h"
 #include "llvm/DerivedTypes.h"
 #include "llvm/CodeGen/MachineFunctionPass.h"
 #include "llvm/CodeGen/MachineRelocation.h"
@@ -486,8 +487,13 @@ namespace llvm {
     MachOSection *getDataSection() {
       return getSection("__DATA", "__data");
     }
-    MachOSection *getConstSection(const Type *Ty) {
-      // FIXME: support cstring literals and pointer literal
+    MachOSection *getConstSection(Constant *C) {
+      const ConstantArray *CVA = dyn_cast<ConstantArray>(C);
+      if (CVA && CVA->isCString())
+        return getSection("__TEXT", "__cstring", 
+                          MachOSection::S_CSTRING_LITERALS);
+      
+      const Type *Ty = C->getType();
       if (Ty->isPrimitiveType() || Ty->isInteger()) {
         unsigned Size = TM.getTargetData()->getTypeSize(Ty);
         switch(Size) {
index 63f1ad4da8f849835400d77e8bcfd2d1e5b105c5..bd7c5364968d5d1755f14d12128908f6832912c0 100644 (file)
@@ -245,7 +245,7 @@ void MachOCodeEmitter::emitConstantPool(MachineConstantPool *MCP) {
     const Type *Ty = CP[i].getType();
     unsigned Size = TM.getTargetData()->getTypeSize(Ty);
 
-    MachOWriter::MachOSection *Sec = MOW.getConstSection(Ty);
+    MachOWriter::MachOSection *Sec = MOW.getConstSection(CP[i].Val.ConstVal);
     OutputBuffer SecDataOut(Sec->SectionData, is64Bit, isLittleEndian);
 
     CPLocations.push_back(Sec->SectionData.size());
@@ -390,7 +390,8 @@ void MachOWriter::EmitGlobal(GlobalVariable *GV) {
   // Scalar read-only data goes in a literal section if the scalar is 4, 8, or
   // 16 bytes, or a cstring.  Other read only data goes into a regular const
   // section.  Read-write data goes in the data section.
-  MachOSection *Sec = GV->isConstant() ? getConstSection(Ty) : getDataSection();
+  MachOSection *Sec = GV->isConstant() ? getConstSection(GV->getInitializer()) : 
+                                         getDataSection();
   AddSymbolToSection(Sec, GV);
   InitMem(GV->getInitializer(), &Sec->SectionData[0], GVOffset[GV],
           TM.getTargetData(), Sec->Relocations);
@@ -716,7 +717,11 @@ void MachOWriter::CalculateRelocations(MachOSection &MOS) {
       intptr_t Offset = GVOffset[GV];
       Scattered = TargetSection != 0;
       
-      assert(MOSPtr && "Trying to relocate unknown global!");
+      if (!MOSPtr) {
+        cerr << "Trying to relocate unknown global " << *GV << '\n';
+        continue;
+        //abort();
+      }
       
       TargetSection = MOSPtr->Index;
       MR.setResultPointer((void*)Offset);