summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/Support/DynamicLibrary/PipSqueak.cxx
blob: 0c2ec0010afd9ce776281b1465614682128c2308 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
//===- llvm/unittest/Support/DynamicLibrary/PipSqueak.cxx -----------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "PipSqueak.h"
#include "llvm/Transforms/IPO/PassManagerBuilder.h"

#define PIPSQUEAK_TESTA_RETURN "LibCall"
#include "ExportedFuncs.cxx"

struct Global {
  std::string *Str;
  std::vector<std::string> *Vec;
  Global() : Str(nullptr), Vec(nullptr) {}
  ~Global() {
    if (Str) {
      if (Vec)
        Vec->push_back(*Str);
      *Str = "Global::~Global";
    }
  }
};

static Global Glb;

struct Local {
  std::string &Str;
  Local(std::string &S) : Str(S) {
    Str = "Local::Local";
    if (Glb.Str && !Glb.Str->empty())
      Str += std::string("(") + *Glb.Str + std::string(")");
  }
  ~Local() { Str = "Local::~Local"; }
};


extern "C" PIPSQUEAK_EXPORT void SetStrings(std::string &GStr,
                                            std::string &LStr) {
  Glb.Str = &GStr;
  static Local Lcl(LStr);
}

extern "C" PIPSQUEAK_EXPORT void TestOrder(std::vector<std::string> &V) {
  Glb.Vec = &V;
}


static void LibPassRegistration(const llvm::PassManagerBuilder &,
                                llvm::legacy::PassManagerBase &) {}

extern "C" PIPSQUEAK_EXPORT void TestPassReg(
    void (*addGlobalExtension)(llvm::PassManagerBuilder::ExtensionPointTy,
                               llvm::PassManagerBuilder::ExtensionProc)) {
  addGlobalExtension(llvm::PassManagerBuilder::EP_EarlyAsPossible,
                     LibPassRegistration);
}
OpenPOWER on IntegriCloud