make getFixupKindInfo return a const reference, allowing
authorChris Lattner <sabre@nondot.org>
Thu, 11 Feb 2010 21:27:18 +0000 (21:27 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 11 Feb 2010 21:27:18 +0000 (21:27 +0000)
the tables to be const.  Teach MCCodeEmitter to handle
the target-indep kinds so that we don't crash on them.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@95924 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/MC/MCCodeEmitter.h
lib/MC/MCAsmStreamer.cpp
lib/MC/MCCodeEmitter.cpp
lib/Target/X86/X86MCCodeEmitter.cpp

index 5565945f5abaf8a2f918b73b0b97c688c97d80b1..fe1aff4f8c926c1c76a966a47357bf2c9ddcffa7 100644 (file)
@@ -56,7 +56,7 @@ public:
   virtual unsigned getNumFixupKinds() const = 0;
 
   /// getFixupKindInfo - Get information on a fixup kind.
-  virtual MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const = 0;
+  virtual const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const;
 
   /// @}
 
index 828377f42cc9c6217fff631b029296ab985384e0..2a8f168f9318be84443e053e847123924a48012e 100644 (file)
@@ -552,7 +552,7 @@ void MCAsmStreamer::AddEncodingComment(const MCInst &Inst) {
 
   for (unsigned i = 0, e = Fixups.size(); i != e; ++i) {
     MCFixup &F = Fixups[i];
-    MCFixupKindInfo &Info = Emitter->getFixupKindInfo(F.getKind());
+    const MCFixupKindInfo &Info = Emitter->getFixupKindInfo(F.getKind());
     for (unsigned j = 0; j != Info.TargetSize; ++j) {
       unsigned Index = F.getOffset() * 8 + Info.TargetOffset + j;
       assert(Index < Code.size() * 8 && "Invalid offset in fixup!");
@@ -599,7 +599,7 @@ void MCAsmStreamer::AddEncodingComment(const MCInst &Inst) {
 
   for (unsigned i = 0, e = Fixups.size(); i != e; ++i) {
     MCFixup &F = Fixups[i];
-    MCFixupKindInfo &Info = Emitter->getFixupKindInfo(F.getKind());
+    const MCFixupKindInfo &Info = Emitter->getFixupKindInfo(F.getKind());
     OS << "  fixup " << char('A' + i) << " - " << "offset: " << F.getOffset()
        << ", value: " << *F.getValue() << ", kind: " << Info.Name << "\n";
   }
index c122763b2fe596a550d3982863450333b0995917..accb06c8af54fff7c04631f2c7abc948a791f1dd 100644 (file)
@@ -16,3 +16,15 @@ MCCodeEmitter::MCCodeEmitter() {
 
 MCCodeEmitter::~MCCodeEmitter() {
 }
+
+const MCFixupKindInfo &MCCodeEmitter::getFixupKindInfo(MCFixupKind Kind) const {
+  static const MCFixupKindInfo Builtins[] = {
+    { "FK_Data_1", 0, 8 },
+    { "FK_Data_2", 0, 16 },
+    { "FK_Data_4", 0, 32 },
+    { "FK_Data_8", 0, 64 }
+  };
+  
+  assert(Kind <= 3 && "Unknown fixup kind");
+  return Builtins[Kind];
+}
index 7ec7cec6604dacd0302dbe54cfe128716ffbd6f2..15510e844cb705c3520024bd1f05191a220c1d9e 100644 (file)
@@ -45,16 +45,19 @@ public:
   ~X86MCCodeEmitter() {}
 
   unsigned getNumFixupKinds() const {
-    return 1;
+    return 2;
   }
 
-  MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const {
-    static MCFixupKindInfo Infos[] = {
+  const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const {
+    const static MCFixupKindInfo Infos[] = {
       { "reloc_pcrel_4byte", 0, 4 * 8 },
       { "reloc_pcrel_1byte", 0, 1 * 8 }
     };
+    
+    if (Kind < FirstTargetFixupKind)
+      return MCCodeEmitter::getFixupKindInfo(Kind);
 
-    assert(Kind >= FirstTargetFixupKind && Kind < MaxTargetFixupKind &&
+    assert(unsigned(Kind - FirstTargetFixupKind) < getNumFixupKinds() &&
            "Invalid kind!");
     return Infos[Kind - FirstTargetFixupKind];
   }