#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"
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) {
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());
// 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);
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);