[llvm-branch-commits] [llvm-branch] r351442 - Merging r351345:

Hans Wennborg via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Thu Jan 17 05:34:38 PST 2019


Author: hans
Date: Thu Jan 17 05:34:38 2019
New Revision: 351442

URL: http://llvm.org/viewvc/llvm-project?rev=351442&view=rev
Log:
Merging r351345:
------------------------------------------------------------------------
r351345 | asl | 2019-01-16 15:03:41 +0100 (Wed, 16 Jan 2019) | 23 lines

[MSP430] Emit a separate section for every interrupt vector

This is LLVM part of D56663

Linker scripts shipped by TI require to have every
interrupt vector in a separate section with a specific name:

 SECTIONS
 {
   __interrupt_vector_XX   : { KEEP (*(__interrupt_vector_XX )) } > VECTXX
   ...
 }

Follow the requirement emit the section for every vector
which contain address of interrupt handler:

  .section  __interrupt_vector_XX,"ax", at progbits
  .word %isr%

Patch by Kristina Bessonova!

Differential Revision: https://reviews.llvm.org/D56664

------------------------------------------------------------------------

Modified:
    llvm/branches/release_80/   (props changed)
    llvm/branches/release_80/lib/Target/MSP430/MSP430AsmPrinter.cpp
    llvm/branches/release_80/test/CodeGen/MSP430/2009-12-21-FrameAddr.ll
    llvm/branches/release_80/test/CodeGen/MSP430/fp.ll
    llvm/branches/release_80/test/CodeGen/MSP430/interrupt.ll

Propchange: llvm/branches/release_80/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Jan 17 05:34:38 2019
@@ -1,3 +1,3 @@
 /llvm/branches/Apple/Pertwee:110850,110961
 /llvm/branches/type-system-rewrite:133420-134817
-/llvm/trunk:155241,351349,351436
+/llvm/trunk:155241,351344-351345,351349,351436

Modified: llvm/branches/release_80/lib/Target/MSP430/MSP430AsmPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/release_80/lib/Target/MSP430/MSP430AsmPrinter.cpp?rev=351442&r1=351441&r2=351442&view=diff
==============================================================================
--- llvm/branches/release_80/lib/Target/MSP430/MSP430AsmPrinter.cpp (original)
+++ llvm/branches/release_80/lib/Target/MSP430/MSP430AsmPrinter.cpp Thu Jan 17 05:34:38 2019
@@ -17,6 +17,7 @@
 #include "MSP430InstrInfo.h"
 #include "MSP430MCInstLower.h"
 #include "MSP430TargetMachine.h"
+#include "llvm/BinaryFormat/ELF.h"
 #include "llvm/CodeGen/AsmPrinter.h"
 #include "llvm/CodeGen/MachineConstantPool.h"
 #include "llvm/CodeGen/MachineFunctionPass.h"
@@ -28,6 +29,7 @@
 #include "llvm/IR/Module.h"
 #include "llvm/MC/MCAsmInfo.h"
 #include "llvm/MC/MCInst.h"
+#include "llvm/MC/MCSectionELF.h"
 #include "llvm/MC/MCStreamer.h"
 #include "llvm/MC/MCSymbol.h"
 #include "llvm/Support/TargetRegistry.h"
@@ -44,6 +46,8 @@ namespace {
 
     StringRef getPassName() const override { return "MSP430 Assembly Printer"; }
 
+    bool runOnMachineFunction(MachineFunction &MF) override;
+
     void printOperand(const MachineInstr *MI, int OpNum,
                       raw_ostream &O, const char* Modifier = nullptr);
     void printSrcMemOperand(const MachineInstr *MI, int OpNum,
@@ -55,6 +59,8 @@ namespace {
                                unsigned OpNo, unsigned AsmVariant,
                                const char *ExtraCode, raw_ostream &O) override;
     void EmitInstruction(const MachineInstr *MI) override;
+
+    void EmitInterruptVectorSection(MachineFunction &ISR);
   };
 } // end of anonymous namespace
 
@@ -153,6 +159,32 @@ void MSP430AsmPrinter::EmitInstruction(c
   EmitToStreamer(*OutStreamer, TmpInst);
 }
 
+void MSP430AsmPrinter::EmitInterruptVectorSection(MachineFunction &ISR) {
+  MCSection *Cur = OutStreamer->getCurrentSectionOnly();
+  const auto *F = &ISR.getFunction();
+  assert(F->hasFnAttribute("interrupt") &&
+         "Functions with MSP430_INTR CC should have 'interrupt' attribute");
+  StringRef IVIdx = F->getFnAttribute("interrupt").getValueAsString();
+  MCSection *IV = OutStreamer->getContext().getELFSection(
+    "__interrupt_vector_" + IVIdx,
+    ELF::SHT_PROGBITS, ELF::SHF_ALLOC | ELF::SHF_EXECINSTR);
+  OutStreamer->SwitchSection(IV);
+
+  const MCSymbol *FunctionSymbol = getSymbol(F);
+  OutStreamer->EmitSymbolValue(FunctionSymbol, TM.getProgramPointerSize());
+  OutStreamer->SwitchSection(Cur);
+}
+
+bool MSP430AsmPrinter::runOnMachineFunction(MachineFunction &MF) {
+  // Emit separate section for an interrupt vector if ISR
+  if (MF.getFunction().getCallingConv() == CallingConv::MSP430_INTR)
+    EmitInterruptVectorSection(MF);
+
+  SetupMachineFunction(MF);
+  EmitFunctionBody();
+  return false;
+}
+
 // Force static initialization.
 extern "C" void LLVMInitializeMSP430AsmPrinter() {
   RegisterAsmPrinter<MSP430AsmPrinter> X(getTheMSP430Target());

Modified: llvm/branches/release_80/test/CodeGen/MSP430/2009-12-21-FrameAddr.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/release_80/test/CodeGen/MSP430/2009-12-21-FrameAddr.ll?rev=351442&r1=351441&r2=351442&view=diff
==============================================================================
--- llvm/branches/release_80/test/CodeGen/MSP430/2009-12-21-FrameAddr.ll (original)
+++ llvm/branches/release_80/test/CodeGen/MSP430/2009-12-21-FrameAddr.ll Thu Jan 17 05:34:38 2019
@@ -3,7 +3,7 @@
 target datalayout = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8"
 target triple = "msp430-unknown-linux-gnu"
 
-define msp430_intrcc void @foo() nounwind {
+define msp430_intrcc void @foo() nounwind #0 {
 entry:
 	%fa = call i8* @llvm.frameaddress(i32 0)
 	store i8 0, i8* %fa
@@ -11,3 +11,5 @@ entry:
 }
 
 declare i8* @llvm.frameaddress(i32)
+
+attributes #0 = { noinline nounwind optnone "interrupt"="2" }

Modified: llvm/branches/release_80/test/CodeGen/MSP430/fp.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/release_80/test/CodeGen/MSP430/fp.ll?rev=351442&r1=351441&r2=351442&view=diff
==============================================================================
--- llvm/branches/release_80/test/CodeGen/MSP430/fp.ll (original)
+++ llvm/branches/release_80/test/CodeGen/MSP430/fp.ll Thu Jan 17 05:34:38 2019
@@ -27,3 +27,5 @@ define msp430_intrcc void @fpb_alloced()
   call void asm sideeffect "nop", "r"(i8 0)
   ret void
 }
+
+attributes #0 = { noinline nounwind optnone "interrupt"="2" }

Modified: llvm/branches/release_80/test/CodeGen/MSP430/interrupt.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/release_80/test/CodeGen/MSP430/interrupt.ll?rev=351442&r1=351441&r2=351442&view=diff
==============================================================================
--- llvm/branches/release_80/test/CodeGen/MSP430/interrupt.ll (original)
+++ llvm/branches/release_80/test/CodeGen/MSP430/interrupt.ll Thu Jan 17 05:34:38 2019
@@ -13,6 +13,9 @@ target triple = "msp430-generic-generic"
 ; instruction RETI, which restores the SR register and branches to the PC where
 ; the interrupt occurred.
 
+; CHECK:      .section	__interrupt_vector_2,"ax", at progbits
+; CHECK-NEXT:	.short	ISR
+
 @g = global float 0.0
 
 define msp430_intrcc void @ISR() #0 {
@@ -47,3 +50,4 @@ entry:
   ret void
 }
 
+attributes #0 = { noinline nounwind optnone "interrupt"="2" }




More information about the llvm-branch-commits mailing list