Enable emitting of constant values in non-default address space as well. The APIs...
authorSanjiv Gupta <sanjiv.gupta@microchip.com>
Fri, 30 Jan 2009 04:25:10 +0000 (04:25 +0000)
committerSanjiv Gupta <sanjiv.gupta@microchip.com>
Fri, 30 Jan 2009 04:25:10 +0000 (04:25 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@63377 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/AsmPrinter.h
include/llvm/Target/TargetAsmInfo.h
lib/CodeGen/AsmPrinter/AsmPrinter.cpp
lib/Target/PIC16/PIC16AsmPrinter.cpp
lib/Target/PIC16/PIC16AsmPrinter.h
lib/Target/PIC16/PIC16TargetAsmInfo.cpp
lib/Target/PIC16/PIC16TargetAsmInfo.h

index cdc795162579e0043a349d75876e807df7b1edfe..d63b06d954e271ab8baf3494573ba6d3ccda33fd 100644 (file)
@@ -309,7 +309,7 @@ namespace llvm {
   protected:
     /// EmitZeros - Emit a block of zeros.
     ///
-    void EmitZeros(uint64_t NumZeros) const;
+    void EmitZeros(uint64_t NumZeros, unsigned AddrSpace = 0) const;
 
     /// EmitString - Emit a zero-byte-terminated string constant.
     ///
@@ -320,7 +320,7 @@ namespace llvm {
     void EmitConstantValueOnly(const Constant *CV);
 
     /// EmitGlobalConstant - Print a general LLVM constant to the .s file.
-    void EmitGlobalConstant(const Constant* CV);
+    void EmitGlobalConstant(const Constant* CV, unsigned AddrSpace = 0);
 
     virtual void EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV);
     
@@ -351,7 +351,7 @@ namespace llvm {
     
     /// printDataDirective - This method prints the asm directive for the
     /// specified type.
-    void printDataDirective(const Type *type);
+    void printDataDirective(const Type *type, unsigned AddrSpace = 0);
 
     /// printSuffixedName - This prints a name with preceding 
     /// getPrivateGlobalPrefix and the specified suffix, handling quoted names
@@ -371,11 +371,12 @@ namespace llvm {
     const GlobalValue *findGlobalValue(const Constant* CV);
     void EmitLLVMUsedList(Constant *List);
     void EmitXXStructorList(Constant *List);
-    void EmitGlobalConstantStruct(const ConstantStruct* CVS);
+    void EmitGlobalConstantStruct(const ConstantStruct* CVS,
+                                  unsigned AddrSpace);
     void EmitGlobalConstantArray(const ConstantArray* CVA);
     void EmitGlobalConstantVector(const ConstantVector* CP);
-    void EmitGlobalConstantFP(const ConstantFP* CFP);
-    void EmitGlobalConstantLargeInt(const ConstantInt* CI);
+    void EmitGlobalConstantFP(const ConstantFP* CFP, unsigned AddrSpace);
+    void EmitGlobalConstantLargeInt(const ConstantInt* CI, unsigned AddrSpace);
     GCMetadataPrinter *GetOrCreateGCPrinter(GCStrategy *C);
   };
 }
index bdfacf765715f1eecb4ab0605080d1b270927946..1cd55d0fcd1df45c5a51a36098c58a871cfd86cf 100644 (file)
@@ -598,6 +598,21 @@ namespace llvm {
 
     static unsigned getULEB128Size(unsigned Value);
 
+    // Data directive accessors
+    //
+    virtual const char *getData8bitsDirective(unsigned AddrSpace = 0) const {
+      return Data8bitsDirective;
+    }
+    virtual const char *getData16bitsDirective(unsigned AddrSpace = 0) const {
+      return Data16bitsDirective;
+    }
+    virtual const char *getData32bitsDirective(unsigned AddrSpace = 0) const {
+      return Data32bitsDirective;
+    }
+    virtual const char *getData64bitsDirective(unsigned AddrSpace = 0) const {
+      return Data64bitsDirective;
+    }
+
     // Accessors.
     //
     const Section *getTextSection() const {
@@ -711,18 +726,6 @@ namespace llvm {
     const char *getAscizDirective() const {
       return AscizDirective;
     }
-    const char *getData8bitsDirective() const {
-      return Data8bitsDirective;
-    }
-    const char *getData16bitsDirective() const {
-      return Data16bitsDirective;
-    }
-    const char *getData32bitsDirective() const {
-      return Data32bitsDirective;
-    }
-    const char *getData64bitsDirective() const {
-      return Data64bitsDirective;
-    }
     const char *getJumpTableDirective() const {
       return JumpTableDirective;
     }
index 9334f1ef3f2e930fd0e5476fcbce8fece158b41c..c6b0313c39f426d7df3106643eff22f92dd56f77 100644 (file)
@@ -770,7 +770,7 @@ void AsmPrinter::EmitAlignment(unsigned NumBits, const GlobalValue *GV,
     
 /// EmitZeros - Emit a block of zeros.
 ///
-void AsmPrinter::EmitZeros(uint64_t NumZeros) const {
+void AsmPrinter::EmitZeros(uint64_t NumZeros, unsigned AddrSpace) const {
   if (NumZeros) {
     if (TAI->getZeroDirective()) {
       O << TAI->getZeroDirective() << NumZeros;
@@ -779,7 +779,7 @@ void AsmPrinter::EmitZeros(uint64_t NumZeros) const {
       O << '\n';
     } else {
       for (; NumZeros; --NumZeros)
-        O << TAI->getData8bitsDirective() << "0\n";
+        O << TAI->getData8bitsDirective(AddrSpace) << "0\n";
     }
   }
 }
@@ -956,7 +956,8 @@ void AsmPrinter::EmitGlobalConstantVector(const ConstantVector *CP) {
     EmitGlobalConstant(CP->getOperand(I));
 }
 
-void AsmPrinter::EmitGlobalConstantStruct(const ConstantStruct *CVS) {
+void AsmPrinter::EmitGlobalConstantStruct(const ConstantStruct *CVS,
+                                          unsigned AddrSpace) {
   // Print the fields in successive locations. Pad to align if needed!
   const TargetData *TD = TM.getTargetData();
   unsigned Size = TD->getTypePaddedSize(CVS->getType());
@@ -972,46 +973,47 @@ void AsmPrinter::EmitGlobalConstantStruct(const ConstantStruct *CVS) {
     sizeSoFar += fieldSize + padSize;
 
     // Now print the actual field value.
-    EmitGlobalConstant(field);
+    EmitGlobalConstant(field, AddrSpace);
 
     // Insert padding - this may include padding to increase the size of the
     // current field up to the ABI size (if the struct is not packed) as well
     // as padding to ensure that the next field starts at the right offset.
-    EmitZeros(padSize);
+    EmitZeros(padSize, AddrSpace);
   }
   assert(sizeSoFar == cvsLayout->getSizeInBytes() &&
          "Layout of constant struct may be incorrect!");
 }
 
-void AsmPrinter::EmitGlobalConstantFP(const ConstantFP *CFP) {
+void AsmPrinter::EmitGlobalConstantFP(const ConstantFP *CFP, 
+                                      unsigned AddrSpace) {
   // FP Constants are printed as integer constants to avoid losing
   // precision...
   const TargetData *TD = TM.getTargetData();
   if (CFP->getType() == Type::DoubleTy) {
     double Val = CFP->getValueAPF().convertToDouble();  // for comment only
     uint64_t i = CFP->getValueAPF().bitcastToAPInt().getZExtValue();
-    if (TAI->getData64bitsDirective())
-      O << TAI->getData64bitsDirective() << i << '\t'
+    if (TAI->getData64bitsDirective(AddrSpace))
+      O << TAI->getData64bitsDirective(AddrSpace) << i << '\t'
         << TAI->getCommentString() << " double value: " << Val << '\n';
     else if (TD->isBigEndian()) {
-      O << TAI->getData32bitsDirective() << unsigned(i >> 32)
+      O << TAI->getData32bitsDirective(AddrSpace) << unsigned(i >> 32)
         << '\t' << TAI->getCommentString()
         << " double most significant word " << Val << '\n';
-      O << TAI->getData32bitsDirective() << unsigned(i)
+      O << TAI->getData32bitsDirective(AddrSpace) << unsigned(i)
         << '\t' << TAI->getCommentString()
         << " double least significant word " << Val << '\n';
     } else {
-      O << TAI->getData32bitsDirective() << unsigned(i)
+      O << TAI->getData32bitsDirective(AddrSpace) << unsigned(i)
         << '\t' << TAI->getCommentString()
         << " double least significant word " << Val << '\n';
-      O << TAI->getData32bitsDirective() << unsigned(i >> 32)
+      O << TAI->getData32bitsDirective(AddrSpace) << unsigned(i >> 32)
         << '\t' << TAI->getCommentString()
         << " double most significant word " << Val << '\n';
     }
     return;
   } else if (CFP->getType() == Type::FloatTy) {
     float Val = CFP->getValueAPF().convertToFloat();  // for comment only
-    O << TAI->getData32bitsDirective()
+    O << TAI->getData32bitsDirective(AddrSpace)
       << CFP->getValueAPF().bitcastToAPInt().getZExtValue()
       << '\t' << TAI->getCommentString() << " float " << Val << '\n';
     return;
@@ -1026,42 +1028,42 @@ void AsmPrinter::EmitGlobalConstantFP(const ConstantFP *CFP) {
     DoubleVal.convert(APFloat::IEEEdouble, APFloat::rmNearestTiesToEven,
                       &ignored);
     if (TD->isBigEndian()) {
-      O << TAI->getData16bitsDirective() << uint16_t(p[0] >> 48)
+      O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 48)
         << '\t' << TAI->getCommentString()
         << " long double most significant halfword of ~"
         << DoubleVal.convertToDouble() << '\n';
-      O << TAI->getData16bitsDirective() << uint16_t(p[0] >> 32)
+      O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 32)
         << '\t' << TAI->getCommentString()
         << " long double next halfword\n";
-      O << TAI->getData16bitsDirective() << uint16_t(p[0] >> 16)
+      O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 16)
         << '\t' << TAI->getCommentString()
         << " long double next halfword\n";
-      O << TAI->getData16bitsDirective() << uint16_t(p[0])
+      O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0])
         << '\t' << TAI->getCommentString()
         << " long double next halfword\n";
-      O << TAI->getData16bitsDirective() << uint16_t(p[1])
+      O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[1])
         << '\t' << TAI->getCommentString()
         << " long double least significant halfword\n";
      } else {
-      O << TAI->getData16bitsDirective() << uint16_t(p[1])
+      O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[1])
         << '\t' << TAI->getCommentString()
         << " long double least significant halfword of ~"
         << DoubleVal.convertToDouble() << '\n';
-      O << TAI->getData16bitsDirective() << uint16_t(p[0])
+      O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0])
         << '\t' << TAI->getCommentString()
         << " long double next halfword\n";
-      O << TAI->getData16bitsDirective() << uint16_t(p[0] >> 16)
+      O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 16)
         << '\t' << TAI->getCommentString()
         << " long double next halfword\n";
-      O << TAI->getData16bitsDirective() << uint16_t(p[0] >> 32)
+      O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 32)
         << '\t' << TAI->getCommentString()
         << " long double next halfword\n";
-      O << TAI->getData16bitsDirective() << uint16_t(p[0] >> 48)
+      O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 48)
         << '\t' << TAI->getCommentString()
         << " long double most significant halfword\n";
     }
     EmitZeros(TD->getTypePaddedSize(Type::X86_FP80Ty) -
-              TD->getTypeStoreSize(Type::X86_FP80Ty));
+              TD->getTypeStoreSize(Type::X86_FP80Ty), AddrSpace);
     return;
   } else if (CFP->getType() == Type::PPC_FP128Ty) {
     // all long double variants are printed as hex
@@ -1069,29 +1071,29 @@ void AsmPrinter::EmitGlobalConstantFP(const ConstantFP *CFP) {
     APInt api = CFP->getValueAPF().bitcastToAPInt();
     const uint64_t *p = api.getRawData();
     if (TD->isBigEndian()) {
-      O << TAI->getData32bitsDirective() << uint32_t(p[0] >> 32)
+      O << TAI->getData32bitsDirective(AddrSpace) << uint32_t(p[0] >> 32)
         << '\t' << TAI->getCommentString()
         << " long double most significant word\n";
-      O << TAI->getData32bitsDirective() << uint32_t(p[0])
+      O << TAI->getData32bitsDirective(AddrSpace) << uint32_t(p[0])
         << '\t' << TAI->getCommentString()
         << " long double next word\n";
-      O << TAI->getData32bitsDirective() << uint32_t(p[1] >> 32)
+      O << TAI->getData32bitsDirective(AddrSpace) << uint32_t(p[1] >> 32)
         << '\t' << TAI->getCommentString()
         << " long double next word\n";
-      O << TAI->getData32bitsDirective() << uint32_t(p[1])
+      O << TAI->getData32bitsDirective(AddrSpace) << uint32_t(p[1])
         << '\t' << TAI->getCommentString()
         << " long double least significant word\n";
      } else {
-      O << TAI->getData32bitsDirective() << uint32_t(p[1])
+      O << TAI->getData32bitsDirective(AddrSpace) << uint32_t(p[1])
         << '\t' << TAI->getCommentString()
         << " long double least significant word\n";
-      O << TAI->getData32bitsDirective() << uint32_t(p[1] >> 32)
+      O << TAI->getData32bitsDirective(AddrSpace) << uint32_t(p[1] >> 32)
         << '\t' << TAI->getCommentString()
         << " long double next word\n";
-      O << TAI->getData32bitsDirective() << uint32_t(p[0])
+      O << TAI->getData32bitsDirective(AddrSpace) << uint32_t(p[0])
         << '\t' << TAI->getCommentString()
         << " long double next word\n";
-      O << TAI->getData32bitsDirective() << uint32_t(p[0] >> 32)
+      O << TAI->getData32bitsDirective(AddrSpace) << uint32_t(p[0] >> 32)
         << '\t' << TAI->getCommentString()
         << " long double most significant word\n";
     }
@@ -1099,7 +1101,8 @@ void AsmPrinter::EmitGlobalConstantFP(const ConstantFP *CFP) {
   } else assert(0 && "Floating point constant type not handled");
 }
 
-void AsmPrinter::EmitGlobalConstantLargeInt(const ConstantInt *CI) {
+void AsmPrinter::EmitGlobalConstantLargeInt(const ConstantInt *CI,
+                                            unsigned AddrSpace) {
   const TargetData *TD = TM.getTargetData();
   unsigned BitWidth = CI->getBitWidth();
   assert(isPowerOf2_32(BitWidth) &&
@@ -1116,20 +1119,20 @@ void AsmPrinter::EmitGlobalConstantLargeInt(const ConstantInt *CI) {
     else
       Val = RawData[i];
 
-    if (TAI->getData64bitsDirective())
-      O << TAI->getData64bitsDirective() << Val << '\n';
+    if (TAI->getData64bitsDirective(AddrSpace))
+      O << TAI->getData64bitsDirective(AddrSpace) << Val << '\n';
     else if (TD->isBigEndian()) {
-      O << TAI->getData32bitsDirective() << unsigned(Val >> 32)
+      O << TAI->getData32bitsDirective(AddrSpace) << unsigned(Val >> 32)
         << '\t' << TAI->getCommentString()
         << " Double-word most significant word " << Val << '\n';
-      O << TAI->getData32bitsDirective() << unsigned(Val)
+      O << TAI->getData32bitsDirective(AddrSpace) << unsigned(Val)
         << '\t' << TAI->getCommentString()
         << " Double-word least significant word " << Val << '\n';
     } else {
-      O << TAI->getData32bitsDirective() << unsigned(Val)
+      O << TAI->getData32bitsDirective(AddrSpace) << unsigned(Val)
         << '\t' << TAI->getCommentString()
         << " Double-word least significant word " << Val << '\n';
-      O << TAI->getData32bitsDirective() << unsigned(Val >> 32)
+      O << TAI->getData32bitsDirective(AddrSpace) << unsigned(Val >> 32)
         << '\t' << TAI->getCommentString()
         << " Double-word most significant word " << Val << '\n';
     }
@@ -1137,27 +1140,27 @@ void AsmPrinter::EmitGlobalConstantLargeInt(const ConstantInt *CI) {
 }
 
 /// EmitGlobalConstant - Print a general LLVM constant to the .s file.
-void AsmPrinter::EmitGlobalConstant(const Constant *CV) {
+void AsmPrinter::EmitGlobalConstant(const Constant *CV, unsigned AddrSpace) {
   const TargetData *TD = TM.getTargetData();
   const Type *type = CV->getType();
   unsigned Size = TD->getTypePaddedSize(type);
 
   if (CV->isNullValue() || isa<UndefValue>(CV)) {
-    EmitZeros(Size);
+    EmitZeros(Size, AddrSpace);
     return;
   } else if (const ConstantArray *CVA = dyn_cast<ConstantArray>(CV)) {
     EmitGlobalConstantArray(CVA);
     return;
   } else if (const ConstantStruct *CVS = dyn_cast<ConstantStruct>(CV)) {
-    EmitGlobalConstantStruct(CVS);
+    EmitGlobalConstantStruct(CVS, AddrSpace);
     return;
   } else if (const ConstantFP *CFP = dyn_cast<ConstantFP>(CV)) {
-    EmitGlobalConstantFP(CFP);
+    EmitGlobalConstantFP(CFP, AddrSpace);
     return;
   } else if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) {
     // Small integers are handled below; large integers are handled here.
     if (Size > 4) {
-      EmitGlobalConstantLargeInt(CI);
+      EmitGlobalConstantLargeInt(CI, AddrSpace);
       return;
     }
   } else if (const ConstantVector *CP = dyn_cast<ConstantVector>(CV)) {
@@ -1165,7 +1168,7 @@ void AsmPrinter::EmitGlobalConstant(const Constant *CV) {
     return;
   }
 
-  printDataDirective(type);
+  printDataDirective(type, AddrSpace);
   EmitConstantValueOnly(CV);
   if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) {
     SmallString<40> S;
@@ -1491,21 +1494,21 @@ void AsmPrinter::printPICJumpTableSetLabel(unsigned uid, unsigned uid2,
 
 /// printDataDirective - This method prints the asm directive for the
 /// specified type.
-void AsmPrinter::printDataDirective(const Type *type) {
+void AsmPrinter::printDataDirective(const Type *type, unsigned AddrSpace) {
   const TargetData *TD = TM.getTargetData();
   switch (type->getTypeID()) {
   case Type::IntegerTyID: {
     unsigned BitWidth = cast<IntegerType>(type)->getBitWidth();
     if (BitWidth <= 8)
-      O << TAI->getData8bitsDirective();
+      O << TAI->getData8bitsDirective(AddrSpace);
     else if (BitWidth <= 16)
-      O << TAI->getData16bitsDirective();
+      O << TAI->getData16bitsDirective(AddrSpace);
     else if (BitWidth <= 32)
-      O << TAI->getData32bitsDirective();
+      O << TAI->getData32bitsDirective(AddrSpace);
     else if (BitWidth <= 64) {
-      assert(TAI->getData64bitsDirective() &&
+      assert(TAI->getData64bitsDirective(AddrSpace) &&
              "Target cannot handle 64-bit constant exprs!");
-      O << TAI->getData64bitsDirective();
+      O << TAI->getData64bitsDirective(AddrSpace);
     } else {
       assert(0 && "Target cannot handle given data directive width!");
     }
@@ -1513,15 +1516,15 @@ void AsmPrinter::printDataDirective(const Type *type) {
   }
   case Type::PointerTyID:
     if (TD->getPointerSize() == 8) {
-      assert(TAI->getData64bitsDirective() &&
+      assert(TAI->getData64bitsDirective(AddrSpace) &&
              "Target cannot handle 64-bit pointer exprs!");
-      O << TAI->getData64bitsDirective();
+      O << TAI->getData64bitsDirective(AddrSpace);
     } else if (TD->getPointerSize() == 2) {
-      O << TAI->getData16bitsDirective();
+      O << TAI->getData16bitsDirective(AddrSpace);
     } else if (TD->getPointerSize() == 1) {
-      O << TAI->getData8bitsDirective();
+      O << TAI->getData8bitsDirective(AddrSpace);
     } else {
-      O << TAI->getData32bitsDirective();
+      O << TAI->getData32bitsDirective(AddrSpace);
     }
     break;
   case Type::FloatTyID: case Type::DoubleTyID:
index dc91128d5a385daa8e80537609e6e83dffe2781d..63ad6e4f4488b1a0f4810a84439ed378bf3355a2 100644 (file)
@@ -242,48 +242,11 @@ void PIC16AsmPrinter::EmitInitData (Module &M) {
         continue;
 
       O << name;
-      EmitGlobalConstant(C);
+      EmitGlobalConstant(C, AddrSpace);
     }
   }
 }
 
-void PIC16AsmPrinter::EmitConstantValueOnly(const Constant* CV) {
-  if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) {
-    unsigned BitWidth = CI->getBitWidth();
-    int Val = CI->getZExtValue();
-    if (BitWidth == 8) {
-      // Expecting db directive here. In case of romdata we need to pad the
-      // word with zeros.
-      if (IsRomData)
-        O << 0 <<", ";
-      O << Val; 
-    }
-    else if (BitWidth == 16) {
-      unsigned Element1, Element2;
-      Element1 = 0x00ff & Val;
-      Element2 = 0x00ff & (Val >> 8);
-      if (IsRomData)
-        O << 0 <<", "<<Element1 <<", "<< 0 <<", "<< Element2;
-      else
-        O << Element1 <<", "<< Element2;  
-    }
-    else if (BitWidth == 32) {
-      unsigned Element1, Element2, Element3, Element4;
-      Element1 = 0x00ff & Val;
-      Element2 = 0x00ff & (Val >> 8);
-      Element3 = 0x00ff & (Val >> 16);
-      Element4 = 0x00ff & (Val >> 24);
-      if (IsRomData)
-        O << 0 <<", "<< Element1 <<", "<< 0 <<", "<< Element2 <<", "<< 0 
-          <<", "<< Element3 <<", "<< 0 <<", "<< Element4;
-      else 
-        O << Element1 <<", "<< Element2 <<", "<< Element3 <<", "<< Element4;    
-    }
-    return;
-  }
-  AsmPrinter::EmitConstantValueOnly(CV);
-}
-
 void PIC16AsmPrinter::EmitRomData (Module &M)
 {
   SwitchToSection(TAI->getReadOnlySection());
@@ -308,7 +271,7 @@ void PIC16AsmPrinter::EmitRomData (Module &M)
         continue;
 
       O << name;
-      EmitGlobalConstant(C);
+      EmitGlobalConstant(C, AddrSpace);
       O << "\n";
     }
   }
index 876e4be7439ac95df4d997c9c6ce52a378d7ea2d..ce79afd6079ea22c6809f2cdba396665a76a24b1 100644 (file)
@@ -43,7 +43,6 @@ namespace llvm {
     void EmitInitData (Module &M);
     void EmitUnInitData (Module &M);
     void EmitRomData (Module &M);
-    virtual void EmitConstantValueOnly(const Constant *CV);
     void emitFunctionData(MachineFunction &MF);
     void emitFunctionTempData(MachineFunction &MF, unsigned &FrameSize);
 
index 8e2392e6f71a1d557e4901bac1c2c08db14d0ceb..b86576be896ef454f50b1042290d29a1b1ef291a 100644 (file)
@@ -22,8 +22,11 @@ PIC16TargetAsmInfo(const PIC16TargetMachine &TM)
   : TargetAsmInfo(TM) {
   CommentString = ";";
   Data8bitsDirective = " db ";
-  Data16bitsDirective = " db ";
-  Data32bitsDirective = " db ";
+  Data16bitsDirective = " dw ";
+  Data32bitsDirective = " dl ";
+  RomData8bitsDirective = " dw ";
+  RomData16bitsDirective = " rom_di ";
+  RomData8bitsDirective = " rom_dl ";
   ZeroDirective = NULL;
   AsciiDirective = " dt ";
   AscizDirective = NULL;
@@ -33,3 +36,28 @@ PIC16TargetAsmInfo(const PIC16TargetMachine &TM)
   DataSection = getNamedSection("idata.# IDATA", SectionFlags::Writeable);
   SwitchToSectionDirective = "";
 }
+
+const char *PIC16TargetAsmInfo::getData8bitsDirective(unsigned AddrSpace)
+                                                       const {
+      if (AddrSpace == PIC16ISD::ROM_SPACE)
+        return RomData8bitsDirective;
+      else 
+        return Data8bitsDirective; 
+  }
+
+const char *PIC16TargetAsmInfo::getData16bitsDirective(unsigned AddrSpace)
+                                                       const {
+      if (AddrSpace == PIC16ISD::ROM_SPACE)
+        return RomData16bitsDirective;
+      else
+        return Data16bitsDirective;
+  }
+
+const char *PIC16TargetAsmInfo::getData32bitsDirective(unsigned AddrSpace)
+                                                       const {
+      if (AddrSpace == PIC16ISD::ROM_SPACE)
+        return RomData32bitsDirective;
+      else
+        return Data32bitsDirective;
+  }
+
index 88de79f357eb005cb0b678ccaf1a2c3e8883dbb2..b75699ba8c4b6248916eaba9439d421fa27dfdfe 100644 (file)
@@ -23,7 +23,13 @@ namespace llvm {
 
   struct PIC16TargetAsmInfo : public TargetAsmInfo {
     PIC16TargetAsmInfo(const PIC16TargetMachine &TM);
+    const char *RomData8bitsDirective;
+    const char *RomData16bitsDirective;
+    const char *RomData32bitsDirective;
     public :
+    virtual const char *getData8bitsDirective(unsigned AddrSpace = 0) const;
+    virtual const char *getData16bitsDirective(unsigned AddrSpace = 0) const;
+    virtual const char *getData32bitsDirective(unsigned AddrSpace = 0) const;
   };
 
 } // namespace llvm