From 1257c855d7546afc2705463d9ca913d405724738 Mon Sep 17 00:00:00 2001 From: Nate Begeman Date: Mon, 29 Jan 2007 21:20:42 +0000 Subject: [PATCH] Properly support cstrings git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33629 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/MachOWriter.h | 10 ++++++++-- lib/CodeGen/MachOWriter.cpp | 11 ++++++++--- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/include/llvm/CodeGen/MachOWriter.h b/include/llvm/CodeGen/MachOWriter.h index 0d13c909a94..0de04c0407c 100644 --- a/include/llvm/CodeGen/MachOWriter.h +++ b/include/llvm/CodeGen/MachOWriter.h @@ -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(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) { diff --git a/lib/CodeGen/MachOWriter.cpp b/lib/CodeGen/MachOWriter.cpp index 63f1ad4da8f..bd7c5364968 100644 --- a/lib/CodeGen/MachOWriter.cpp +++ b/lib/CodeGen/MachOWriter.cpp @@ -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);