1 //===- GmpConv.cpp - Recreate LLVM IR from the Scop.  ---------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // Functions for converting between gmp objects and apint.
11 //
12 //===----------------------------------------------------------------------===//
13 #include "polly/Support/GICHelper.h"
14 
15 #include "isl/set.h"
16 #include "isl/union_set.h"
17 #include "isl/map.h"
18 #include "isl/union_map.h"
19 #include "isl/schedule.h"
20 
21 using namespace llvm;
22 
23 void polly::MPZ_from_APInt (mpz_t v, const APInt apint, bool is_signed) {
24   // There is no sign taken from the data, rop will simply be a positive
25   // integer. An application can handle any sign itself, and apply it for
26   // instance with mpz_neg.
27   APInt abs;
28   if (is_signed)
29    abs  = apint.abs();
30   else
31    abs = apint;
32 
33   const uint64_t *rawdata = abs.getRawData();
34   unsigned numWords = abs.getNumWords();
35 
36   // TODO: Check if this is true for all platforms.
37   mpz_import(v, numWords, 1, sizeof (uint64_t), 0, 0, rawdata);
38 
39   if (is_signed && apint.isNegative()) mpz_neg(v, v);
40 }
41 
42 APInt polly::APInt_from_MPZ (const mpz_t mpz) {
43   uint64_t *p = NULL;
44   size_t sz;
45 
46   p = (uint64_t*) mpz_export(p, &sz, 1, sizeof(uint64_t), 0, 0, mpz);
47 
48   if (p) {
49     APInt A((unsigned)mpz_sizeinbase(mpz, 2), (unsigned)sz , p);
50     A = A.zext(A.getBitWidth() + 1);
51     free(p);
52 
53     if (mpz_sgn(mpz) == -1)
54       return -A;
55     else
56       return A;
57   } else {
58     uint64_t val = 0;
59     return APInt(1, 1, &val);
60   }
61 }
62 
63 std::string polly::stringFromIslObj(/*__isl_keep*/ isl_map *map) {
64   isl_printer *p = isl_printer_to_str(isl_map_get_ctx(map));
65   isl_printer_print_map(p, map);
66   char *char_str = isl_printer_get_str(p);
67   std::string string(char_str);
68   free(char_str);
69   isl_printer_free(p);
70   return string;
71 }
72 
73 std::string polly::stringFromIslObj(/*__isl_keep*/ isl_set *set) {
74   isl_printer *p = isl_printer_to_str(isl_set_get_ctx(set));
75   isl_printer_print_set(p, set);
76   char *char_str = isl_printer_get_str(p);
77   std::string string(char_str);
78   free(char_str);
79   isl_printer_free(p);
80   return string;
81 }
82 
83 std::string polly::stringFromIslObj(/*__isl_keep*/ isl_union_map *umap) {
84   isl_printer *p = isl_printer_to_str(isl_union_map_get_ctx(umap));
85   isl_printer_print_union_map(p, umap);
86   char *char_str = isl_printer_get_str(p);
87   std::string string(char_str);
88   free(char_str);
89   isl_printer_free(p);
90   return string;
91 }
92 
93 std::string polly::stringFromIslObj(/*__isl_keep*/ isl_union_set *uset) {
94   isl_printer *p = isl_printer_to_str(isl_union_set_get_ctx(uset));
95   isl_printer_print_union_set(p, uset);
96   char *char_str = isl_printer_get_str(p);
97   std::string string(char_str);
98   free(char_str);
99   isl_printer_free(p);
100   return string;
101 }
102 
103 std::string polly::stringFromIslObj(/*__isl_keep*/ isl_schedule *schedule) {
104   isl_ctx *ctx = isl_union_map_get_ctx(isl_schedule_get_map(schedule));
105   isl_printer *p = isl_printer_to_str(ctx);
106   isl_printer_print_schedule(p, schedule);
107   char *char_str = isl_printer_get_str(p);
108   std::string string(char_str);
109   free(char_str);
110   isl_printer_free(p);
111   return string;
112 }
113