Skip to content

Commit

Permalink
[MSP430] Emit a separate section for every interrupt vector
Browse files Browse the repository at this point in the history
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",@progbits
  .word %isr%

Patch by Kristina Bessonova!

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

llvm-svn: 351345
  • Loading branch information
asl committed Jan 16, 2019
1 parent 383e827 commit cbdb4ef
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 1 deletion.
32 changes: 32 additions & 0 deletions llvm/lib/Target/MSP430/MSP430AsmPrinter.cpp
Expand Up @@ -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"
Expand All @@ -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"
Expand All @@ -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,
Expand All @@ -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

Expand Down Expand Up @@ -153,6 +159,32 @@ void MSP430AsmPrinter::EmitInstruction(const MachineInstr *MI) {
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());
Expand Down
4 changes: 3 additions & 1 deletion llvm/test/CodeGen/MSP430/2009-12-21-FrameAddr.ll
Expand Up @@ -3,11 +3,13 @@
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
ret void
}

declare i8* @llvm.frameaddress(i32)

attributes #0 = { noinline nounwind optnone "interrupt"="2" }
2 changes: 2 additions & 0 deletions llvm/test/CodeGen/MSP430/fp.ll
Expand Up @@ -27,3 +27,5 @@ define msp430_intrcc void @fpb_alloced() #0 {
call void asm sideeffect "nop", "r"(i8 0)
ret void
}

attributes #0 = { noinline nounwind optnone "interrupt"="2" }
4 changes: 4 additions & 0 deletions llvm/test/CodeGen/MSP430/interrupt.ll
Expand Up @@ -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",@progbits
; CHECK-NEXT: .short ISR

@g = global float 0.0

define msp430_intrcc void @ISR() #0 {
Expand Down Expand Up @@ -47,3 +50,4 @@ entry:
ret void
}

attributes #0 = { noinline nounwind optnone "interrupt"="2" }

0 comments on commit cbdb4ef

Please sign in to comment.